互联网 Java 工程师面试题(Java 面试题五)

JVM 底层 与 GC(Garbage Collection) 的面试问题

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

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

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

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

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 应用的性能。编辑器

3 年工做经验的 Java 面试题

40、解释 Java 堆空间及 GC?

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

JVM 底层面试题及答案

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

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

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

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

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

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

关于内存的的面试问题和答案
Java 基本概念面试题

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 文件时,确保从新编译你的程序。

Java 集合框架的面试题
这部分也包含数据结构、算法及数组的面试问题

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

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

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

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

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

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

5一、ArrayList 与 LinkedList 的不区别?

最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素, ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。更多细节的讨论参见 答案。

5二、用哪两种方式来实现集合的排序?

你可使用有序集合,如 TreeSet 或 TreeMap,你也可使用有顺序的的集合, 如 list,而后经过 Collections.sort() 来排序。

5三、Java 中怎么打印数组?

你可使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由 于数组没有实现 toString() 方法,因此若是将数组传递给 System.out.println(方法,将没法打印出数组的内容,可是 Arrays.toString() 能够打印每一个元素。

5四、Java 中的 LinkedList 是单向链表仍是双向链表?

是双向链表,你能够检查 JDK 的源码。在 Eclipse,你可使用快捷键 Ctrl + T, 直接在编辑器中打开该类。

5五、Java 中的 TreeMap 是采用什么树实现的?(答案)

Java 中的 TreeMap 是使用红黑树实现的。

5六、Hashtable 与 HashMap 有什么不一样之处?

这两个类有许多不一样的地方,下面列出了一部分:

a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增长的。

b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,因此会更快。

c)Hashtable 不容许有个空的 key,可是 HashMap 容许出现一个 null key。

更多的不一样之处参见答案。

5七、Java 中的 HashSet,内部是如何工做的?

HashSet 的内部采用 HashMap 来实现。因为 Map 须要 key 和 value,因此 全部 key 的都有一个默认 value。相似于 HashMap,HashSet 不容许重复的 key,只容许有一个 null key,意思就是 HashSet 中只容许存储一个 null 对象。

5八、写一段代码在遍历 ArrayList 时移除一个元素?

该问题的关键在于面试者使用的是 ArrayList 的 remove() 仍是 Iterator 的 remove()方法。这有一段示例代码,是使用正确的方式来实如今遍历的过程当中移 除元素,而不会出现 ConcurrentModificationException 异常的示例代码

5九、咱们能本身写一个容器类,而后使用 for-each 循环码?

能够,你能够写一个本身的容器类。若是你想使用 Java 中加强的循环来遍历, 你只须要实现 Iterable 接口。若是你实现 Collection 接口,默认就具备该属性。

60、ArrayList 和 HashMap 的默认大小是多数?

在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是 16 个元素(必须是 2 的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的 代码片断:

1// from ArrayList.java JDK 1.7
2private static final int DEFAULT_CAPACITY = 10;
3//from HashMap.java JDK 7
4static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

6一、有没有可能两个不相等的对象有有相同的 hashcode?

有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为何在 hashmap 中会有冲突。相等 hashcode 值的规定只是说若是两个对象相等,必 须有相同的 hashcode 值,可是没有关于不相等对象的任何规定。

6二、两个相同的对象会有不一样的的 hash code 吗?

不能,根据 hash code 的规定,这是不可能的。

6三、咱们能够在 hashcode() 中使用随机数字吗?

答案

http://javarevisited.blogspot... ple.html

不行,由于对象的 hashcode 值必须是相同的。参见答案获取更多关于 Java 中 重写 hashCode() 方法的知识。

6四、Java 中,Comparator 与 Comparable 有什么不一样?

Comparable 接口用于定义对象的天然顺序,而 comparator 一般用于定义用户 定制的顺序。Comparable 老是只有一个,可是能够有多个 comparator 来定义 对象的顺序。

6五、为何在重写 equals 方法的时候须要重写 hashCode 方法?(答案)

由于有强制的规范指定须要同时重写 hashcode 与 equal 是方法,许多容器类, 如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。

相关文章
相关标签/搜索