JVM ——知识总结(面试)

时间:2023-03-09 18:41:20
JVM ——知识总结(面试)

1)JAVA语言是一种强语言

2)JAVA不允许使用指针访问内存,不允许使用指针数组访问内存

3)有自动收集垃圾的作用

4)方法调用时,会创建栈帧在栈中,调用完是程序自动出栈释放,而不是gc释放

5)关键字:true、false、null都不是关键字

6)静态类不能直接访问外部参数,非静态可以

7)标识符是以字母、下划线(…)或美元符($)开头,由字母、数字、下划线(一)或美元符($)组成的字符串。

8)构造方法的优先级一般比代码块低

9)抽象类和接口中都可以包含静态成员常量。

10)int 和 Integer 的区别



2. 序列化、反序列化

1)序列化:把对象转换为字节序列的过程,通常应用于存储或网络传输

2)反序列化:把字节序列恢复为对象的过程

JAVA使用ObjectOutputStream作为对象输出流,ObjectInputStream是对象输入流。

只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自 Serializable接口。

 对象序列化包括如下步骤:
  1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
  2) 通过对象输出流的writeObject()方法写对象。

不适用于静态变量。

只要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。该方法不能修饰方法和类。

对象反序列化的步骤如下:
  1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
  2) 通过对象输入流的readObject()方法读取对象。

3. 重构的概念

对软件内部结构的一种调整,在不改变软件的可观察性前提下,提高可理解性,降低修改成本。

4. 进程和线程之间的区别

1)调度:进程:资源的基本单位。线程:CPU调度和分派的单位。同一进程中,切换线程不会引起进程的切换。

2)并发:都可以并发执行。

3)资源:进程:拥有独立单位。线程:访问所属的进程的资源。

4)独立性:进程:独立地址单位和资源。线程:线程间共享。

5)系统开销:进程:涉及CPU环境等设置。线程:仅涉及寄存器的设置、保存,不涉及存储。

6)多处理机:一个进程的多个线程可以分到多个处理机中,加快并行执行。

5. Cookie 于Session区别

存储位置不同,Cookie不安全,不能保存大数据(超过4K),但能减轻服务器压力.

6. FOR和WHILE区别

FOR指令少,简洁

7. Instanceof

指出对象是否是指定类或接口的一个实例,有3种情况会返回true

1)对象是该类的实例

2)对象是该类子类的实例(有继承关系)

3)对象是继承该类的接口类的实例

8.异常

Throwable

| -- Exception

| -- RuntimeException ->空指针,越界等

| -- IO/EOP/FileNotFount/SQL...->必须try catch

| -- Error :内存/栈爆了(程序不能处理的异常)

9. Finally

1、不管是否出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

10. java中hashmap的实现原理,

HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。

简单来说,HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

数组长度:roundUpToPowerOf2中的这段处理使得数组长度一定为2的次幂

以上hash函数计算出的值,通过indexFor进一步处理来获取实际的存储位置 key(hashcode)-->hash-->indexFor-->

通过以上代码能够得知,当发生哈希冲突并且size大于阈值的时候,需要进行数组扩容,扩容时,需要新建一个长度为之前数组2倍的新的数组,然后将当前的Entry数组中的元素全部传输过去,扩容后的新数组长度为之前的2倍,所以扩容相对来说是个耗资源的操作。

11. 考察了jvm的自动装箱和拆箱

装箱就是自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。

public static Integer valueOf(int i) {
if (i >= - && i <= )
return IntegerCache.cache[i + ];
//如果i的值大于-128小于127则返回一个缓冲区中的一个Integer对象
return new Integer(i);
//否则返回 new 一个Integer 对象
}

12, ASCII

标准ASCII只使用7个bit,扩展的ASCII使用8个bit。
ANSI通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码。不同 ANSI 编码之间互不兼容。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。
ANSI通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符,即ASCII码
ASCII码包含一些特殊空字符