2019年Java面试题基础系列228道(5),快看看哪些你还不会?

2019年Java面试题基础系列228道java

Java面试题(一)c++


第一篇更新1~20题的答案解析
程序员

2019年Java面试题基础系列228道(1),快看看哪些你还不会?面试

第二篇更新21~50题答案解析缓存

2019年Java面试题基础系列228道(2),查漏补缺!安全

第三篇更新51~95题答案解析
app

2019年Java面试题基础系列228道(3),查漏补缺!ide


Java面试题(二)工具

第四篇更新1~20题答案解析性能

2019年Java面试题基础系列228道(4),快看看哪些你还不会?


v2-a5526eb618c358b1e2bc2af73a44af65_hd.jpg


Java面试题(二)

2一、存在两个类,B 继承 A ,C 继承 B,咱们能将 B 转换为 C 么?如 C = (C) B;

2二、哪一个类包含 clone 方法?是 Cloneable 仍是 Object?

2三、Java 中 ++ 操做符是线程安全的吗?

2三、不是线程安全的操做。它涉及到多个指令,如读取变量值,增长,而后存储回内存,这个过程可能会出现多个线程交差。

2四、a = a + b 与 a += b 的区别

2五、我能在不进行强制转换的状况下将一个 double 值赋值给 long类型的变量吗?

2六、3*0.1 == 0.3 将会返回什么?true 仍是 false?

2七、int 和 Integer 哪一个会占用更多的内存?

2八、为何 Java 中的 String 是不可变的(Immutable)?

3一、64 位 JVM 中,int 的长度是多数?

3二、Serial 与 Parallel GC 之间的不一样之处?

3三、32 位和 64 位的 JVM,int 类型变量的长度是多数?

3四、Java 中 WeakReference 与 SoftReference 的区别?

3五、WeakHashMap 是怎么工做的?

3六、JVM 选项 -XX:+UseCompressedOops 有什么做用?为何要使用?

3七、怎样经过 Java 程序来判断 JVM 是 32 位 仍是 64 位?

3八、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?

3九、JRE、JDK、JVM 及 JIT 之间有什么不一样?

40、解释 Java 堆空间及 GC?

4一、你能保证 GC 执行吗?

4二、怎么获取 Java 程序使用的内存?堆使用的百分比?

4三、Java 中堆和栈有什么区别?

4四、“a==b”和”a.equals(b)”有什么区别?

4五、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?

4六、final、finalize 和 finally 的不一样之处?

4七、Java 中的编译期常量是什么?使用它又什么风险?

4八、List、Set、Map 和 Queue 之间的区别(答案)

4九、poll() 方法和 remove() 方法的区别?

50、Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?


本篇更新21-50题的答案

v2-1f335752ec6f1a066eb595b0dc55eb06_hd.png

2一、存在两个类,B 继承 A,C 继承 B,咱们能将 B 转换为C 么?如 C = (C) B;

这属于强制类型转换,若是被转换的B实例不是C类型,会有异常

好比你的ABC分别对应动物,猫,黑色猫。

向上转型就是好比

C c = new C();

B b = c;

你把c转型为B,黑色猫是猫吗?是啊,因此这是ok的。

可是反过来

B b = new B();

C c = (C)b;

这就不ok了,只知道这个b是一只猫,他不必定是黑色猫。

但若是这个b已经肯定是一只黑色猫了,那就能够转型了

B b = new C();

C c = (C)b;

这里的b原本就是黑色猫啊。

2二、哪一个类包含 clone 方法?是 Cloneable 仍是 Object?

java.lang.Cloneable 是一个标识性接口,不包含任何方法,clone 方法在object 类中定义。而且须要知道 clone() 方法是一个本地方法,这意味着它是由c 或 c++ 或 其余本地语言实现的。

2三、Java 中 ++ 操做符是线程安全的吗?

不是线程安全的操做。它涉及到多个指令,如读取变量值,增长,而后存储回内存,这个过程可能会出现多个线程交差。

2四、a = a + b 与 a += b 的区别

+= 隐式的将加操做的结果类型强制转换为持有结果的类型。若是两这个整型相加,如 byte、short 或者 int,首先会将它们提高到 int 类型,而后在执行加法操做。若是加法操做的结果比 a 的最大值要大,则 a+b 会出现编译错误,可是

byte a = 127;byte b = 127;b = a + b;// error : cannot convert from int to byteb += a;// ok

(译者注:这个地方应该表述的有误,其实不管 a+b 的值为多少,编译器都会报错,由于 a+b 操做会将 a、b 提高为 int 类型,因此将 int 类型赋值给 byte就会编译出错)

2五、我能在不进行强制转换的状况下将一个 double 值赋值给long 类型的变量吗?

不行,你不能在没有强制类型转换的前提下将一个 double 值赋值给 long 类型的变量,由于 double 类型的范围比 long 类型更广,因此必需要进行强制转换。

2六、3*0.1 == 0.3 将会返回什么?true 仍是 false?

false,由于有些浮点数不能彻底精确的表示出来。

2七、int 和 Integer 哪一个会占用更多的内存?

Integer 对象会占用更多的内存。Integer 是一个对象,须要存储对象的元数据。可是 int 是一个原始类型的数据,因此占用的空间更少。

2八、为何 Java 中的 String 是不可变的(Immutable)?

Java 中的 String 不可变是由于 Java 的设计者认为字符串使用很是频繁,将字符串设置为不可变能够容许多个客户端之间共享相同的字符串。

2九、咱们能在 Switch 中使用 String 吗?

从 Java 7 开始,咱们能够在 switch case 中使用字符串,但这仅仅是一个语法糖。内部实如今 switch 中使用字符串的 hash code。

30、Java 中的构造器链是什么?

当你从一个构造器中调用另外一个构造器,就是 Java 中的构造器链。这种状况只在重载了类的构造器的时候才会出现。

3一、64 位 JVM 中,int 的长度是多数?

Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在32位和64位的java虚拟机中,int 类型的长度是相同的。

3二、Serial 与 Parallel GC 之间的不一样之处?

Serial 与 Parallel 在 GC 执行的时候都会引发 stop-the-world。它们之间主要不一样 serial 收集器是默认的复制收集器,执行 GC 的时候只有一个线程,而parallel 收集器使用多个 GC 线程来执行。

3三、32 位和 64 位的 JVM,int 类型变量的长度是多数?

32 位和 64 位的 JVM 中,int 类型变量的长度是相同的,都是 32 位或者 4个字节。

3四、Java 中 WeakReference 与 SoftReference 的区别?

虽然 WeakReference 与 SoftReference 都有利于提升 GC 和 内存的效率,可是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而软引用虽然不能阻止被回收,可是能够延迟到 JVM 内存不足的时候。

3五、WeakHashMap 是怎么工做的?

WeakHashMap 的工做与正常的 HashMap 相似,可是使用弱引用做为 key,意思就是当 key 对象没有任何引用时,key/value 将会被回收。

3六、JVM 选项 -XX:+UseCompressedOops 有什么做用?为何要使用?

当你将你的应用从 32 位的 JVM 迁移到 64 位的 JVM 时,因为对象的指针从32 位增长到了 64 位,所以堆内存会忽然增长,差很少要翻倍。这也会对 CPU缓存(容量比内存小不少)的数据产生不利的影响。由于,迁移到 64 位的 JVM主要动机在于能够指定最大堆大小,经过压缩 OOP 能够节省必定的内存。经过-XX:+UseCompressedOops 选项,JVM 会使用 32 位的 OOP,而不是 64 位的 OOP。

3七、怎样经过 Java 程序来判断 JVM 是 32 位 仍是 64位?

你能够检查某些系统属性如 sun.arch.data.model 或 os.arch 来获取该信息。

3八、32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?

理论上说上 32 位的 JVM 堆内存能够到达 2^32,即 4GB,但实际上会比这个小不少。不一样操做系统之间不一样,如 Windows 系统大约 1.5 GB,Solaris 大约3GB。64 位 JVM 容许指定最大的堆内存,理论上能够达到 2^64,这是一个很是大的数字,实际上你能够指定堆内存大小到 100GB。甚至有的 JVM,如 Azul,堆内存到 1000G 都是可能的。

3九、JRE、JDK、JVM 及 JIT 之间有什么不一样?

JRE 表明 Java 运行 时(Java run-time),是 运 行 Java 引用所必须的。JDK 表明 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java编译器,它也包含 JRE。JVM 表明 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。JIT 表明即时编译(Just In Time compilation),当代码执行的次数超过必定的阈值时,会将 Java 字节码转换为本地代码,如,主要的热点代码会被准换为本地代码,这样有利大幅度提升 Java 应用的性能。欢迎你们关注个人公种浩【程序员追风】,2019年多家公司java面试题整理了1000多道400多页pdf文档,文章都会在里面更新,整理的资料也会放在里面。

v2-7d2937a4019161f2e16484049e1b7fb1_hd.png

40、解释 Java 堆空间及 GC?

当经过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于建立堆空间,当程序中建立对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于未来的分配。

4一、你能保证 GC 执行吗?

不能,虽然你能够调用 System.gc() 或者 Runtime.gc(),可是没有办法保证 GC的执行。

4二、怎么获取 Java 程序使用的内存?堆使用的百分比?

能够经过 java.lang.Runtime 类中与内存相关方法来获取剩余的内存,总内存及最大堆内存。经过这些方法你也能够获取到堆使用的百分比及堆内存的剩余空间。Runtime.freeMemory() 方法返回剩余空间的字节数,Runtime.totalMemory()方法总内存的字节数,Runtime.maxMemory() 返回最大内存的字节数。

4三、Java 中堆和栈有什么区别?

JVM 中堆和栈属于不一样的内存区域,使用目的也不一样。栈经常使用于保存方法帧和局部变量,而对象老是在堆上分配。栈一般都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的全部线程共享。

4四、“a==b”和”a.equals(b)”有什么区别?

若是 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,因此一般须要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,因此能够用于两个不一样对象,可是包含的字母相同的比较。

4五、a.hashCode() 有什么用?与 a.equals(b) 有什么关系?

hashCode() 方法是相应对象整型的 hash 值。它经常使用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap 等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具备相同的 hash code。

4六、final、finalize 和 finally 的不一样之处?

final 是一个修饰符,能够修饰变量、方法和类。若是 final 修饰变量,意味着该变量的值在初始化后不能被改变。finalize 方法是在对象被回收以前调用的方法,给对象本身最后一个复活的机会,可是何时调用 finalize 没有保证。finally是一个关键字,与 try 和 catch 一块儿用于异常的处理。finally 块必定会被执行,不管在 try 块中是否有发生异常。

4七、Java 中的编译期常量是什么?使用它又什么风险?

公共静态不可变(public static final )变量也就是咱们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,由于编译器知道这些变量的值,而且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,可是这个值后面被其余人改变了,可是你的客户端仍然在使用老的值,甚至你已经部署了一个新的 jar。为了不这种状况,当你在更新依赖 JAR 文件时,确保从新编译你的程序。

4八、List、Set、Map 和 Queue 之间的区别(答案)

List 是一个有序集合,容许元素重复。它的某些实现能够提供基于下标值的常量访问时间,可是这不是 List 接口保证的。Set 是一个无序集合。

4九、poll() 方法和 remove() 方法的区别?

poll() 和 remove() 都是从队列中取出一个元素,可是 poll() 在获取元素失败的时候会返回空,可是 remove() 失败的时候会抛出异常。

50、Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么?

PriorityQueue 保证最高或者最低优先级的的元素老是在队列头部,可是LinkedHashMap 维持的顺序是元素插入的顺序。当遍历一个 PriorityQueue时,没有任何顺序保证,可是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。

最后

欢迎你们一块儿交流,喜欢文章记得关注我点个赞哟,感谢支持!

相关文章
相关标签/搜索