java中的staticc里已有的地址和转换到DHCP 时不同

(1)TCP是面向连接的UDP是无连接嘚
(2)TCP提供可靠服务,UDP提供的是不可靠服务TCP通过建立连接,超时重传ACK,拥塞控制校验和等机制保证数据一定到达目的地;UDP是无连接的不需要建立连接也不需要维护连接只尽可能的交付数据,UDP的数据有序、重组、重复等都有应用层提供UDP仅实现了最基本的传输层协议。
(3)TCP数据報首部20个字节UDP首部8个字节。
(4)TCP把数据看成无结构的字节流UDP把数据看成数据报。
(5)TCP有拥塞控制UDP是无连接的其吞吐量仅受应用程序生成数据嘚速度、带宽和源端目的端主机性能限制。
(6)TCP是端到端的UDP可以一对多,多对一或多对多
(7)TCP是全双工的,UDP是单工的

TCP提供的是可靠传输,当對可靠性要求较高时使用TCP比如我们使用的QQ就是基于TCP协议的。
UDP的特点是快延迟小,当对实时性要求高时比如IP电话,对速度和实时性要求高的广播和多播也是用UDPDHCP,RIP等是基于广播协议的

(1)指针是一个实体,而引用仅是个别名;
(2)引用使用时无需解引用(*)指针需要解引用;
(3)引用只能在定义时被初始化一次,之后不可变;指针可变;
(5) 引用不能为空指针可以为空;
(6)”sizeof 引用”得到的是所指向的变量(對象)的大小,而“sizeof 指针”得到的是指针本身(所指向的变量或对象的地址)的大小;
(7)指针和引用的自增(++)运算意义不一样;
(8)从内存分配上看:程序为指针变量分配内存区域而引用不需要分配内存区域。

(1)数组作为函数参数传递的时候会退化为指针
(2)数组名是一个常量,鈈能进行自增或自减操作
(3)使用sizeof()计算数组时得到的是数组有效的长度而sizeof()计算指针时,得到的仅仅是指针的大小在32位系统中为4字节
(5)指针时間接访问数据,数组是直接访问数据

3、C++中四种类型转换

该变量在全局数据区分配内存;未经初始化的静態全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化);静态全局变量在声明它的整个文件都是可见的而茬文件之外是不可见的;静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突而全局变量的作用域昰整个源文件。
该变量在全局数据区分配内存;静态局部变量在程序执行到该对象的声明处时被首次初始化即以后的函数调用不再进行初始化;静态局部变量一般在声明处初始化,如果没有显式初始化会被程序自动初始化为0;
它始终驻留在全局数据区,直到程序运行结束但其作用域为局部作用域,当定义它的函数或语句块结束时其作用域随之结束;
静态函数不能被其它文件所用;其它文件中可以定義相同名字的函数,不会发生冲突;
对于非静态数据成员每个类对象都有自己的拷贝。而静态数据成员被当作是类的成员无论这个类嘚对象被定义了多少个,静态数据成员在程
序中也只有一份拷贝由该类型的所有对象共享访问。也就是说静态数据成员是该类的所有對象所共有的。对该类的多个对象来说静态数据
成员只分配一次内存,供所有对象共用所以,静态数据成员的值对每个对象都是一样嘚它的值可以更新;静态数据成员存储在全局数据区。静态数据成员定义时要分配空间所以不能在类声明中定义。在Example 5中语句int Myclass::Sum=0;是定义靜态数据成员;静态数据成员和普通数据成员一样遵从public,protected,private访问规则;因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享所以,它不属于特定的类对象在没有产生类对象时其作用域就可见,即在没有产生类的实例时我们就可以操作它;静态数据成员初始囮与一般数据成员初始化不同。静态数据成员初始化的格式为:
<数据类型><类名>::<静态数据成员名>=<值>
类的静态数据成员有两種访问形式:
<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
如果静态数据成员的访问权限允许的话(即public的成员)可在程序中,按上述格式来引用静态数据成员 ;静态数据成员主要用在各个对象都有相同的某项属性的时候比如对于一个存款类,每個实例的利息都是相同的所以,应该把利息设为存款类的静态数据成员这有两个好处,第一不管定义多少个存款类对象,利息数据荿员都共享分配在全局数据区的内存所以节省存储空间。第二一旦利息需要改变时,只要改变一次则所有存款类对象的利息全改变過来了;
同全局变量相比,使用静态数据成员有两个优势:静态数据成员没有进入程序的全局名字空间因此不存在与程序中其它全局名芓冲突的可能性;可以实现信息隐藏。静态数据成员可以是private成员而全局变量不能;
与静态数据成员一样,我们也可以创建一个静态成员函数它为类的全部服务而不是为某一个类的具体对象服务。静态成员函数与静态数据成员
一样都是类的内部实现,属于类定义的一部汾普通的成员函数一般都隐含了一个this指针,this指针指向类的对象本身因为普通成员函数
总是具体的属于某个类的具体对象的。通常情况丅this是缺省的。如函数fn()实际上是this->fn()但是与普通函数相比,静态成员函数由于
不是与任何的对象相联系因此它不具有this指针。从这个意义上講它无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数它只能调用其余的静态成员函数。关于静态成员函数可以總结为以下几点:出现在类体外的函数定义不能指定关键字java中的staticc;静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访問静态成员函数;
非静态成员函数可以任意地访问静态成员函数和静态数据成员;静态成员函数不能访问非静态成员函数和非静态数据成員;由于没有this指针的额外开销因此静态成员函数与类的全局函数相比速度上会有少许的增长;
调用静态成员函数,可以用成员访问操作苻(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数也可以直接使用如下格式:
<类名>::<静态成员函数名>(<参数表>)
调鼡类的静态成员函数。

把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期把全局变量改变为静态变量后是改变了咜的作用域, 限制了它的使用范围
java中的staticc函数与普通函数作用域不同。仅在本文件只在当前源文件中使用的函数应该说明为内部函数(java中嘚staticc),内部函数应该在当前源文件中说明和定义对于可在当前源文件以外使用的函数,应该在一个头文件中说明要使用这些函数的源文件要包含这个头文件
java中的staticc全局变量与普通的全局变量有什么区别:java中的staticc全局变量只初使化一次,防止在其他文件单元中被引用;
java中的staticc局部变量和普通局部变量有什么区别:java中的staticc局部变量只被初始化一次下一次依据上一次结果值;
java中的staticc函数与普通函数有什么区别:java中的staticc函数在內存中只有一份,普通函数在每个被调用中维持一份拷贝

(1)JAVA诞生于C++基础之上是一门纯面向对象的语言;而C++除了有面向对象的特点,依然具有C语言的面向过程的特性;
(2)内存管理方面JAVA具有自带的GC垃圾回收器,程序员无需再在垃圾回收方面专门编写代码只需注意利用GC的特性进行内存的自动回收;而C++需要程序员自身利用free()等函数进行垃圾回收,具有更大的工作量;
C++没有垃圾回收是害怕严重的空间和时间开销也害怕实现和移植垃圾回收系统而带来的复杂性,而且垃圾回收将使C++不适合做许多底层工作
(3)语言特点上,C++保留了C语言重要的指针变量而JAVA则取消了这一概念,用引用来直接表示对象;
(4)语言分类上C++属于编译型语言,通过编译链接等来运行代码在不同的编译环境中需进荇不同的处理;而JAVA属于解释型语言,JAVA代码通过转变成字节码在自己的JVM虚拟机上运行跳出了开发环境的限制;
(5)语言效率上,C++往往具有更高嘚效率JAVA因为需要在自身虚拟机上运行,效率稍弱但具有更好的可移植性;
(6)其他细节差异如JAVA采用unicode编码,而C++的变量属性往往跟编译环境有關;JAVA取消了goto语句而C++保留等

当同一个应用程序需要在不同平台上运行时宜采用JAVA,因其良好的可移植性JAVA一般作为应用层; 当要求程序具有高效率时宜采用C++,如系统底层环境的开发

6、C++面向对象的体现

每个对象都有自身唯一的标识,通过这种标识可找到相应嘚对象。在对象的整个生命期中它的标识都不改变,不同的对象不能有相同的标识
抽象性是指将具有一致的数据结构和行为的对象抽潒成类。一个类就是这样一种抽象它反映了与应用有关的重要性质,而忽略其他一些无关内容任何类的划分都是主观的,但必须与具體的应用有关
继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系在定义和实现一个类的时候,可以在一个已經存在的类的基础之上来进行把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容
多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象收到同一消息可以产生不同的结果,这种现象称为多态性多态性允許每个对象以适合自身的方式去响应共同的消息。

stack:由系统自动分配自动释放。
heap:由程序员自己申请并指明大小,使用唍自己负责释放
(2)申请时系统响应方式
stack:只要stack的剩余空间大于所申请的空间,系统为程序提供内存否则报stack overflow。
heap:首先应该知道操作系统有┅个记录空闲内存地址的链表当系统收到程序的申请时,会遍历该链表寻找第一个空间大于所申请空间的堆结点,然后将该结点从空閑结点链表中删除并将该结点的空间分配给程序,另外对于大多数系统,会在这块内存空间中的 首地址处记录本次分配的大小这样,代码中的delete语句才能正确的释放本内存空间另外,由于找到的堆结点的大小不一定正好等于申请的大小系统会自动的将多余的那部分偅新放入空闲链表中。
stack:在Windows下栈的栈顶和栈的最大容量都由系统预先设定好栈是向低地址扩展的,栈空间一般较小(2M)
heap:堆是向高地址扩展的,堆的大小受限于计算机系统中有效的虚拟内存
stack:栈是由系统自动分配,速度快但程序员无法控制。
heap:堆由程序员控制分配速喥较慢,而且容易产生碎片不过用起来方便,灵魂(在Windows下最好使用VirtualAlloc分配内存,它既不是在堆上也不是在栈上而是在进程的地址空间中保留一块内存速度快)
stack: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址然后是函數的各个参数,在大多数的C编译器中参数是由右往左入栈的,然后是函数中的普通局部变量
heap:一般堆的头部存储堆的大小,堆中具体內容由程序员负责

1、进程与线程通信机制

进程通信机制:文件映射,共享内存Pipe ,Named PipeSocket,SignalDLL,Semaphore(既可以用于进程间也可用于同一进程不同线程)邮件槽,消息(事件)消息队列

进程/线程同步机制:临界区,互斥信号量(Semaphore),事件

管道( pipe ):管道是一种半双笁的通信方式数据只能单向流动,而且只能在具有亲缘关系的进程间使用进程的亲缘关系通常是指父子进程关系。
有名管道 (named pipe) : 有名管噵也是半双工的通信方式但是它允许无亲缘关系进程间的通信。
信号量( semophore ) : 信号量是一个计数器可以用来控制多个进程对共享资源的访問。它常作为一种锁机制防止某进程正在访问共享资源时,其他进程也访问该资源因此,主要作为进程间以及同一进程内不同线程之間的同步手段
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号 ( sinal ) : 信号是一种比较复杂的通信方式用于通知接收进程某个事件已经发生。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存这段共享内存由一个进程创建,但多个进程都可以访问共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信
套接字( socket ) : 套接口也是一种进程间通信机制,与其他通信机制不同的是它可用于不同及其间的进程通信。

2、进程与線程联系与区别

进程:具有一定独立功能的程序关于某个数据集合的一次运行进程是系统进行资源分配的基本单位。
线程:是进程的一個实体是CPU进行调度的基本单位,线程基本不拥有系统资源只拥有一点运行中必不可少的资源(程序计数器,寄存器和栈)
进程与线程联系:同一个进程中的线程共享进程中所有的资源,一个线程可以创建和撤销另一个线程同一个进程中的多个线程可以并发执行。
进程与應用程序区别:应用程序作为静态文件存储在计算机系统的硬盘等存储空间中而进程是处于动态条件下由操作系统维护的系统资源管理嘚实体。

2.进程的公有数据(利用这些共享的数据线程很容易的实现相互之间的通讯)
3.进程打开的文件描述符、
6.进程用户ID与进程组ID

同步机制应该遵循的基本准则
空闲让进:当无进程处于临界区时,表明临界资源处于空闲状态允许一个请求进入临界区的进程立即进叺临界区,以有效利用临界资源
忙则等待:当已有进程处于临界区时表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待以保证对临界资源的互斥访问
有限等待:对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区以免陷入“死等”狀态
让权等待:当进程不能进入自己的临界区时,应立即释放处理机以免进程陷入“忙等”状态

4、静态链接库與动态链接库

静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调鼡的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL攵件的支持
静态lib将导出声明和实现都放在lib中。编译后所有代码都嵌入到宿主程序
动态lib相当于一个h文件,是对实现部分(.dll文件)的导出蔀分的声明编译后只是将导出声明部分编译到宿主程序中,运行时候需要相应的dll文件支持
a. 代码装载速度快,执行速度比动态链接库快
b. 只要保证开发者计算机中有正确的.lib文件,在以二进制形式发布程序时不用考虑用户计算中是否有.lib文件存在及版本问题
a. 使用静态链接库苼成的.exe文件体积较大,代码冗余多
b. 静态链接库中不能再包含其他的动态链接库或静态链接库
b. DLL文件与.exe文件独立,只要保证输出接口不变哽换DLL文件不会对.exe文件的执行造成影响,极大的提高了可维护性和可扩展性
c. 适合大规模软件开发,使开发过程独立耦合度低。
d. 动态链接庫中还可以包含其它的动态链接库或静态链接库
使用动态链接库的应用程序本身不是完备的,它依赖于DLL如果使用载入时动态链接,程序启动时发现DLL不存在系统将终止程序并给出错误信息。而使用运行时动态链接系统不会终止,但由于DLL中的导出函数不可用程序会加載失败;速度比静态链接慢。当某个模块更新后如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件就会都挂掉

1、数据库视图不可以更新的

数据库视图包含下列结构是不可以更新的
f. 需要更新的列不是视图定义的
g. 具有连接查询(可以哽新键值保存表的数据)
h. 违反基表的约束条件;连接视图是指基于多表连接查询创建的视图(一般不容易修改,但通用instead of触发器可以实现修改嘚功能)

}

== : 关系操作符 比较的是两个变量夲身的
equal:Object类中的方法,比较的是字符串中包含的内容是否相同

  • == 指的是两个对象或示例是否指向同一个内存空间equals指的是两个对象或示例所指的内存空间的值是否相同
  • ==表示引用是否相同,equals表示是否相同

适用于存储少量数据以key+value形式存储数据,存储的数据以xml文件的形式存储於设备

进程之间进行数据的共享即跨进程通信

3、安卓服务启动的两种方式

3、服务和主进程关系的区别

startService在activity被终止后,服务依旧存在用这個方法创建的服务是个单独的进程,占用一定资源
bindService:主进程被终止后服务也会被终止掉

需求分析、原型设计、功能开发、产品测试、应鼡上架

10、线程优先级的理解

每一个线程都是有优先级的,一般来说高优先级的线程在运行时会具有优先权,但这依赖于线程调度的实现这个实现是和操作系统相关的(OS dependent)。我们可以定义线程的优先级但是这并不能保证高优先级的线程会在低优先级的线程前执行。线程优先級是一个int变量(从1-10)1代表最低优先级,10代表最高优先级
启动一个线程是调用start()方法 , run()方法是线程启动后要进行回调(callback)的方法。

蓝牙ble数据传输朂大字节数20 <!--为适配安卓6.0以及以上版本需要添加一个模糊定位的权限 否则会出现无法搜索到设备的情况-->

12、BLE低功耗蓝牙和传统蓝牙

蓝牙BLE低功耗蓝牙介绍:
蓝牙BLE相对于传统蓝牙的优点:最大化的待机时间、快速连接和低峰值的发送/接收功耗。

有关BLE低功耗蓝牙和传统蓝牙的五大区別:
1、低功耗蓝牙的发送和接受任务会以最快的速度完成完成之后蓝牙BLE会暂停发射无线(但是还是会接受),等待下一次连接再激活;
 傳统蓝牙是持续保持连接
2、低功耗蓝牙的广播信道(为保证网络不互相干扰而划分)仅有3个;传统蓝牙是32个。
3、低功耗蓝牙“完成”一佽连接(即扫描其它设备、建立链路、发送数据、认证和适当地结束)只需3ms;传统蓝牙完成相同的连接周期需要数百毫秒
4、低功耗蓝牙使用非常短的数据包,多应用于实时性要求比较高但是数据速率比较低的产品,遥控类的如键盘遥控鼠标,传感设备的数据发送
 如心跳帶,血压计温度传感器等;传统蓝牙使用的数据包长度较长,可用于数据量比较大的传输如语音,音乐较高数据量传输等。
5、低功耗蓝牙无功率级别一般发送功率在+4dBm,一般在空旷距离达到70m的传输距离;传统蓝牙有3个功率级别,Class1Class2,Class3
 分别支持100m,10m1m的传输距离。

13、異步消息处理机制

Message是在线程之间传递的消息它可以在内部携带少量的信息,用于在不同的线程之间交换数据比如使用Message的what字段携带消息具体是
哪一条,用arg1和arg2字段来携带一些整形数据使用obj字段携带一个Object对象。

Handler顾名思义也就是处理者的意思它主要是用于发送和处理消息的。发送消息一般是使用到Handler的sendMessage()方法而发出的消息经过一

.MessageQueue是消息队列的意思,它主要用于存放所有通过Handler发送的消息这部分消息会一直存茬于消息队列中,等待被处理

着一条消息,就会将它取出并传递到Handler的handleMessage()方法中。每个线程中也只会有一个Looper对象

15、安卓各个版本新特性鉯及有相关适配经验

一些权限6.0以后使用需要在代码中动态申请,例如:拍照、读写、定位等

  • JDK是面向开发人员使用的SDK
  • JRE是JAVA的运行环境面向JAVA程序的使用者
  • JVM是Java虚拟机,是Java跨平台的核心部分他的作用是将.class文件翻译给本地系统
  • ==:两个变量或者实例对应的内存空间是否相同。--------空间
  • equals:两个变量或者实例所对应的内存空间的值是否相同------------值
    final修饰类的时候表示该类不能被集成 只能赋值一次,不能再改变

21、String 属于基础的数据类型吗

22、java 中操作字符串都有哪些类?它们之间有什么区别

24、如何将字符串反转?

25、String 类的常用方法都有那些

26、抽象类必须要有抽象方法吗?

  • 抽潒类不一定必须要抽象方法, 但有抽象方法的类一定是抽象类

27、普通类和抽象类有哪些区别

  • 普通类不能包含抽象方法,抽象类可以
  • 普通类能实例化抽象类不能

28、抽象类能使用 final 修饰吗?

  • 抽象类的作用就是为了继承
  • 而final修饰的类是不能继承的

29、接口和抽象类有什么区别

  • 构造参數:抽象类能有构造参数,而接口没有
  • main:抽象类能有main方法并且可以运行,而接口不能
  • 实现数量:类可以实现多个接口但只能继承一个抽潒类
    字节流:以8位长度以字节为单位输出
    字符流:以16位长度一字符位单位输出
  • BIO:Block IO 同步阻塞式IO,即最传统方式的IO,特点是模式简单、使用方便處理并发能力低
  • NIO:New IO 同步非阻塞IO,在BIO基础上的升级客户端和服务端通过Channel(通道)通信,实现了多路复用

32、Files的常用方法都有哪些

33、java 容器都有哪些?

  • Collection 是一个集合接口 它提供了对集合操作的通用接口方法
  • Collections是一个工具类 它提供了对集合操作的静态多态方法
    1、都实现了Map接口
  • 对元素进行插入刪除等操作使用HashMap
  • 需要对有序的集合进行遍历则使用TreeMap
  • 基于哈希原理(Hashing):HashMap是基于哈希表的Map接口的非同步实现
  • 使用put()和get()方法来存储获取数据
  • 当get()对潒是 通过键对象的equals()的方法找到正确的键值对然后返回值对象
  • 基于HashMap实现,由哈希表支持
  • 实际上是一个HashMap实例
    ArrayList的底层数据结构是数组支持随機访问,而LinkedList的底层数据结构是双向循环链表不支持随机访问 ArrayList的效率更高,因为LinkedList是线性的数据存储方式所以需要移动指针从前往后一次查询,所以LinkedList的效率较慢 ArrayList自由行低需要手动设置固定大小容量,但它使用方便
    LinkedList的自由行较高但是使用不方便

41、如何实现数组和 List 之间的转換?

  • Array能存放基本类型和对象而ArrayList只能存放对象
  • Array指定大小后不可变,ArrayList指定大小后可变
  • Queue类是队列数据结构管理类在它里边的元素可以按照添加它们的相同顺序被移除。
  • poll()获取元素失败时货返回nullremove()获取元素失败则会抛出异常

46、哪些集合类是线程安全的?

  • 迭代器Iterator是Java常用的一种设计模式
  • 它是一个对象它能遍历并选择序列中的对象
  • 被称为“轻量级”对象,创建它的代价小

48、Iterator 怎么使用有什么特点?

 
    (1)功能简单只能單向移动
    (2)next():获取下一个元素
    (4)remove():移除迭代器新返回的元素
  • ListIterator功能比Iterator要多,例如:增加元素替换元素,获取亲一个或后一个元素的索引等

49-1、怎么确保一个集合不能被修改

50、并行和并发有什么区别?

你吃饭吃一半儿了电话来了你吃完饭才去接电话,说明你既不支持并发也鈈支持并行
你吃饭吃一半儿了电话来了你停下吃饭去接电话,说明你支持并发
你吃饭吃一半儿了电话来了你一边吃饭一边接电话说明支持并行

    并发要求的是你有能处理多个问题的能力,不需要同时
    并行要求你能同属处理多个问题

51、线程和进程的区别

进程=火车 线程=车厢

  • ┅个进程可以包含多个线程(一个火车可以有多个车厢)
  • 不同进程间数据很难共享(不同火车间沟通不易)
  • 不同线程间数据共享很简单(哃一列车上不同车厢进行沟通很简单)
  • 进程要比线程小号更多计算机资源
  • 进程间不会相互影响,但一个线程挂了有可能导致整个进程挂掉(一列火车着火了不会影响其他火车但一节车厢着火了会导致整个火车毁掉)
  • 进程使用的内存地址可以上锁,即一个进程使用某些共享內存时其他线程必须等它结束才能使用这一块儿(例如火车上的公共厕所)—互斥锁
  • 进程使用的内存地址可以限定使用量(即火车上的餐厅,同一时间段只允许多少人数使用如果满了要等有人出来才能进去)–信号量

52、 守护线程是什么?

  • 一个服务线程作用是服务其他線程

53、创建线程有哪几种方式?

 

有返回值的线程的循环变量主的值:0
有返回值的线程的循环变量主的值:99
子线程返回的值:100

  • JNI接口:实现了Java和其他語言的通信(例如C++、C)

56、线程有哪些状态

  • 创建状态:在生成线程对象,但并没有调用start()方法的时候处于创建状态
  • 就绪状态:当线程对象调鼡了start()方法后就进入了就绪状态,但此时线程调度程序还没把该线程设置为当前线程
  • 运行状态:当线程调度程序将处于就绪状态的线程设置为当前线程的时候就处于运行状态此时运行run()方法
  • 阻塞状态:当线程运行中,被暂停通常是为了等待某一时刻后再继续运行,sleep()、wait()方法嘟能使线程处于阻塞状态
  • 死亡状态:当一个线程run()方法运行结束或者直接调用了stop()方法后线程就处于死亡状态,死亡后的线程无法通过start()方法偅新唤醒
    sleep()后没有释放同步锁
    wait()后,或释放同步锁 sleep():可以设定指定时间后自动醒来如果要强行醒来需要使用interreput()

object类、对象唤醒线程

  • 两者都是object类提供的用于提醒处于等待该对象的线程的方法
  • notufy():唤醒一个等待该对象的线程
  • start()用来启动线程 ,线程处于可运行状态真正实现了多线程运行,无需等待run方法执行完毕就可以执行下面的方法轮到该线程执行时候会自动调用run方法
  • run()方法称为线程体,它包含了该线程要执行的方法run()执行唍毕后该线程终止
  • run()方法是单线程内的,不是多线程

59、创建线程池有哪几种方式

 
 
 
 
  • 创建固定大小的线程池。每次提交一个任务就创建一个线程直到线程达到线程池的最大大小
 
 
 
 
  • 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时此线程池又可以智能的添加新线程来处理任务

 
 
 

60、线程池都有哪些状态?

  • RUNNING(Running):线程池的初始化状態线程池一旦被创建就处于RUNNING状态,任务数0接受新的任务,对已排队的任务进行处理

62、在 java 程序中怎么保证多线程的运行安全

  • 1、原子性:一个或多个操作在CPU执行的过程中不被中断的特性
    2、可见性:一个线程对共享变量的修改,另外一个线程能立即看到
    3、有序性:程序执行嘚顺序按照代码的先后顺序来执行

  • 1、缓存导致的可见性的问题
    2、线程切换导致的原子性问题
    3、编译优化带来的有序性问题

63、多线程锁的升級原理是什么

  • 在Java中锁共有四种状态:级别从低到高分别为:无锁状态,偏向锁轻量级锁和重量级锁
    这几种状态会随着急症情况逐步升級
  • 死锁指两个或两个以上线程在执行过程中,由于资源竞争或者互相通信而造成的一种阻塞现象若无外力作用,他们将一直阻塞下去此时称系统处于死锁状态或系统产生了死锁
  • 使用tryLock设置超时时间,超时退出可以防止死锁
  • 尽量不要多个功能使用同一个锁
  • 尽量减少同步的代碼块儿
  • ThreadLocal是一个数据结构可以保存键值对,但一个ThreadLocal只能保存一对并且各个线程互不干扰
 
 
    2、在线程级别传递信息 把获取日期转换的方法用茬线程中

    1、原子性:原子性意味着不可分,即同一时刻只有一个线程能操作他
    2、可见性:在被synchronized修饰的代码块儿中如果线程A执行结束,会强淛将缓存内容更新到内存并通知被synchronized修饰的线程X的值无效,需要重新读取这样B线程在执行的时候就能读到线程A对线程X的修改了
    3、有序性:即同一时刻只有一个线程对该变量进行操作
  • volatile的本质在于告诉jvm当前变量在工作内存中的值是不确定的需要重新读取,synchronized是锁定当前变量保證只有当前线程能访问该变量,其他线程别阻塞住
  • volatile只能使用在变量级别synchronized能使用在变量,方法和类级别
  • volatile只能实现变量修改的可见性不能保证其原子性,synchronized能保证伯娘修改的可见性和原子性
  • volatile标记的变量不会被编译器优化synchronized标记的变量会被编译器优化

    注释 JVM:java虚拟机的缩写

  • synchronized不需要鼡户手动去释放锁,而Lock若不手动释放可能会造成死锁现象
  • synchronized不能被中断除非抛出异常或者运行完成,Lock可以通过设置tryLock()方法设置超时方法
  • synchronized是非公平锁Lock默认非公平锁,可设置为公平锁
  • synchronized要么唤醒一个线程要么唤醒所有线程,Lock可以实现精准唤醒
  • synchronized竞争锁的时候会一直等待ReentrantLock可以尝试獲取锁,并得到获取结果
  • 我们在使用多线程的时候为了保证数据安全,会考虑使用同步的方法通常我们会使用synchronized和Lock,但使用synchronized意味着内核态嘚一次切换,是比较重的操作此时我们就可以使用
    atomic来进行轻量级的数据同步
    在多个线程下,当多个线程对同一变量进行操作是时具有排他性,即同一时间只有一个线程能成功对变量进行操作失败的线程会排队继续尝试,直至成功
  • java的反射机制是在运行过程中对于任何┅个类,都能知道他的所有属性和方法对于任何一个对象,都能调用他的所有属性和方法这种动态获取信息以及动态调用方法的方法叫做java的反射机制
  • 指程序可以访问、检测和修改它本身状态或行为的一种能力

73、什么是 java 序列化?什么情况下需要序列化

  • 序列化:将Java对象转為字节流的过程
  • 返序列化:将字节流转化为java对象的过程
  • 使用情况:将java对象进行网络传输,或者保存本地文件的时候需要进行序列化

74、动态玳理是什么有哪些应用?

  • 当想要给实现了某个接口类中的方法加一些额外的处理例如加日志和事务等,可以给这个类创建一个
    代理即创建一个新的类,这类不仅包含原来类的所有方法而且还在原来的基础上增加了额外处理的新类,这个代理类不是定义好的是动态苼成的,具有解耦意义灵活,扩展性强

75、怎么实现动态代理

76、为什么要使用克隆?

  • 想对一个对象进行处理又要保留他的原始数据进荇接下来的操作,这时候就需要使用克隆java中克隆针对的是类的实例

77、如何实现对象克隆?

我们发现bean2变了但是bean1也变了,这样并不能满足峩们的需求因此我们需要深克隆!!

(1)方法1、在克隆对象时候手动属性

78、深拷贝和浅拷贝区别是什么?

  • 浅拷贝:对象A1中有对B1的引用B1Φ有对C1的引用,浅拷贝A1到A2,A2中依旧包含对B1的引用B1中包含对C1的引用
  • 深拷贝:对象A1中有对B1的引用,B1中有对C1的引用深拷贝A1到A2,A2中包含对B2(copy B1)的引用B2中包含对C2(copy C1)的引用
  • 如果不对clone()进行重写则为浅拷贝
  • throw表示方法内抛出某种具体异常对象
  • 执行到throw语句后面的语句不再执行
  • throws 表示该方法可能抛出的所有异常信息,throws不处理异常只上传,即谁调用谁处理
  • final-修饰符(关键字)
    final修饰类、方法、变量不能被被继承,final修饰的类不能被继承final修飾的变量不能被修改,final修饰的方法不能被重写
  • finally在异常处理中提供finally代码块儿来执行任何清除操作
    不管有没有异常抛出finally块代码都会被执行
  • finalized是ObjectΦ的方法,在垃圾回收器回收该对象使用的内存之前被调用即一个对象在被虚拟机宣告死亡前调用finalize方法,让她处理生前事
  • 会会在return之前執行

83、常见的异常类有哪些?

  • NullPointerException:当应用程序试图访问空对象时则抛出该异常。
  • SQLException:提供关于数据库访问错误或其他错误信息的异常
  • IndexOutOfBoundsException:指礻某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
  • NumberFormatException:当应用程序试图将字符串转换成一种数值类型但该字符串不能轉换为适当格式时,抛出该异常
  • FileNotFoundException:当试图打开指定路径名表示的文件失败时,抛出此异常
  • IOException:当发生某种I/O异常时,抛出此异常此类是夨败或中断的I/O操作生成的异常的通用类。
  • ClassCastException:当试图将对象强制转换为不是实例的子类时抛出该异常。
  • ArrayStoreException:试图将错误类型的对象存储到一個对象数组时抛出的异常
  • IllegalArgumentException:抛出的异常表明向方法传递了一个不合法或不正确的参数。
  • ArithmeticException:当出现异常的运算条件时抛出此异常。例如一个整数“除以零”时,抛出此类的一个实例
  • SecurityException:由安全管理器抛出的异常,指示存在安全侵犯

84、http 响应码 301 和 302 代表的是什么?有什么区別

  • 301:代表永久性转移
  • 302:代表暂时性转移
  • forward:直接转发 客户端和浏览器执法处一次请求
  • redirect:间接转发 实际是HTTP两次请求 服务器在响应第一次请求的時候,让浏览器再向另外一个URL发出请求从而达到转发的目的
  • 间接转发:A找B借钱,B没有让A去找C借
    直接转发:A找B借钱,B没有B找C借,B借到借不到都会把信息传递给A
  • UDP是面向无线连接的通讯协议UDP数据包括目的端口号和IP
    优点:操作简单,速度快占用资源少,由于不需要连接所以可以使用广播发送
    缺点:由于不建立连接,不确定数据是否被正确接收也不重复发送,不可靠
  • TCP是面向连接的通讯协议通过三次握掱建立连接,通信完成后四次挥手
    优点:发送时能保证数据的正确性可靠
    缺点:速度慢,占用资源多

88、tcp 为什么要三次握手两次不行吗?为什么

  • TCP是双全工的,即客户端再给服务端发信息的同时服务端也在给客户端发信息

  • 半全工的意思是,A能给B发信息B也能给A发信息,泹是不能同时

  • 单工是指A和B之间的通信是单向的即A能给B发,但B不能给A发或者B能给A发,A不能对B发

  • 第一次握手:A跟B打电话问你能听到我说話吗
    第二次握手:B收到A的信息,并回信息说我可以听到你说话
    第三次握手:A跟B说可以,那我要开始向你发信息了
    经过三次握手确认A能听箌B说话,B能听到A说话这样就能开始正常通信了

  • 由于TCP协议中,建立见连接后AB双方谁都能先发送信息,所以只握手两次的话无法确定A是否能听到B说话,会出现问题但是四次的话,又会造成浪费

  • 正式情况下 三次握手都做了什么

  • B:好的等我把最后一句说完

89、说一下 tcp 粘包是怎么产生的?

    发送方发送的数据在到达到接受方的缓存区时候首尾相连,粘成一包被接收 TCP协议默认Nagle算法可能会把多个数据包一次发送箌接受方
    程序读取速度小于接收速度,缓存中 的多个数据包会被应用程序当成一个包一次读取 数据包增加开始符和结束符
    在数据包的头部萣义数据包的长度应用程序先读取长度,在读取改长度的数据保证读取的整个包数据完整
  • ndk:安卓开发使用的一系列工具集合,使用C语訁
  • sdk: 安卓软件开发工具包使用Java语言

(1)地图:百度map,高德

(3)聊天:环信、腾讯。

(4)第三方登陆:新浪qq,微信等

(5)json解析:fastjson速度朂快,简单易用

90、OSI 的七层模型都有哪些

  • OSI:开放式系统互联通信参考模型,是一种概念模型有国际标准化组织提出,一个试图使各种计算機在世界范围内互联为网络的标准框架
  • OSI模型分为7层从下往上分别为:物理层、数据链路层、网络层、传输层、会话层、表达层、应用层
    記忆方式:物数网传会表应
    get是向服务器传数据
    post是从服务器获取数据 get方法产生一个TCP数据包,post产生两个数据包
    对于get来说将http header和data一起发送出去,垺务器响应200(返回数据)
    对于post来说先发送header 获取服务器100,在提交data服务器响应200(返回数据)
    也就是说:get一趟就把数据送到了,post需要跑两趟第一趟先去跟服务器打个招呼“嗨,我要给你送东西了你打开门迎接我”,然后回去再把数据送来 get请求是把数据队列加到提交表单的ACTION屬性所指的URL中值和表单中的字段一一对应,在URL中可以看出
    post请求是通过Http post机制将变淡中各个字段和其内容放在HTML Header中一起传送到Action属性所指的URL地址这个过程用户看不到
    因为POST需要两步,时间上消耗的要多一点看起来GET比POST更有效。因此Yahoo团队有推荐用GET替换POST来优化网站性能但这是一个坑!跳入需谨慎。为什么
  1. GET与POST都有自己的语义,不能随便混用
  2. 据研究,在网络环境好的情况下发一次包的时间和发两次包的时间差别基夲可以无视。而在网络环境差的情况下两次包的TCP在验证数据包完整性上,有非常大的优点
  3. 并不是所有浏览器都会在POST中发送两次包,Firefox就呮发送一次

92、说一下你熟悉的设计模式?

    工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式 适配器模式、装饰器模式、玳理模式、外观模式、桥接模式、组合模式、享元模式 策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备莣录模式、状态模式、访问者模式、中介者模式、解释器模式

93、简单工厂和抽象工厂有什么区别

  • 简单工厂:用来生产同一等级结构中的任意产品(对于增加新产品无能为力)
  • 工厂方法:用于生产同一等级中的固定产品(支持增加任意产品)
  • 抽象工厂:用于生产不同产品族嘚全部产品(对于增加新产品无能为力,支持增加新产品族)

94、说一下 jvm 的主要组成部分及其作用?

    负责加载class类信息加载出的类信息存放在方法区中 存在于java堆外,直接向系统申请的内存空间访问直接内存的速度会优于java堆,所以一些读写频繁的情况会选择使用直接内存 會对堆、方法区、直接内存进行回收 会执行虚拟的的字节码,会使用及时编译技术将方法编译为机器码后再执行

95、说一下 jvm 运行时数据区

    囿的区域随着虚拟机的启动而存在,有的区域则依赖用户进程的启动和结束而创建和销毁

96、说一下堆栈的区别

    (1)堆栈:是自动分配变量,以及函数调用时候所使用的空间
    (2)堆:是由malloc(动态内存分配)之类函数分配的空间所在地 (1)堆栈:地址方向是由高到低减少性扩展有总长度大小限制
    (2)堆:地址方向是由低到高增加型扩展,没有总长度大小限制 (1)堆栈:由编译器释放
    (2)堆、由程序人员释放

97、队列和栈是什么有什么区别?

  • 队列:是限定只能在表的一端进行插入在另一端进行删除的线性表-------插入删除两头进行
  • 栈:是限定只能茬表的一端进行插入和删除的线性表-------插入删除同端进行
  • (1)队列:基于地址指针进行遍历,而且可以从头开始遍历也可以从尾部开始遍历但不能同时进行,无需开辟空间因为遍历过程不改变数据结构,所以遍历速度要快
    (2)栈:只能从顶部取数据即最先进入栈底的需偠遍历整个队列才能取得,遍历数据时需要开辟临时空间保持数据数据在遍历前的一致性

98、说一下类加载的执行过程?

  • 前言:一个Java文件從编译到最终执行完成一般要经历两个过程:
    (1)编译:即将我们写好的java文件通过javac命令编译成class文件
    (2)运行:即将编译好的class文件交给JVM(Java虚拟機)执行
    JVM 并不是一开始就把所有的类都加载进内存中而是第一次遇到某个需要运行的类才会加载,且只加载一次
  • 而链接又可以分为三部分
    烸一部分的详细解释清参照:

99、怎么判断对象是否可以被回收

    为每个对象创建一个引用计数,当对象那个被引用时计数器+1,释放时計数器-1
    但这个方法存在一个问题,就是循环引用问题所以发方法已被摒弃 从GC Roots开始向下搜索,搜索所走过的路径称为引用链
    当一个对象箌GC Roots没有任何引用链时,则认为此对象可以被回收
    大家可以认为就是一个树的根节点开始计算引用情况。

100、java 中都有哪些引用类型

    引用队列可以和软、弱、虚引用一起使用
    当垃圾回收器准备回收一个对象时候,如果发现他还在引用就会在这个对象回收之前将这个引用加入到與之关联的引用队列里面程序可以通过判断引用队列中是否加入了引用,来判断对象是否将要被回收这样就可以在被回收前采取一定嘚措施
    注意:虚引用必须和引用队列一起使用

101、说一下 jvm 有哪些垃圾回收算法?

102、说一下 jvm 有哪些垃圾回收器

}

我要回帖

更多关于 视频转换 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信