转载自 java面试常考系列四
题目一
大O符号(big-O notation)的作用是什么?有哪些使用方法?
大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好。
大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,一般使用大O符号基于时间、内存和性能来选择最好的实现。大O符号可以对大量数据的性能给出一个很好的说明。
题目二
有序数组和无序数组的区别是什么?
1、有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。
2、有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量O(1)。
题目三
Java集合类框架的最佳实践有哪些?
实践一根据应用的需要,正确选择要使用集合的类型对性能非常重要,所以,如果提前知道元素的大小是固定的,我们就会使用Array,而不ArrayList。
实践二
对于那些允许指定初始容量的集合。如果能估计出存储的元素的数目,就可以提前设置初始容量,以此来避免重新计算hash值或者是扩容。
实践三
为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。
实践四
使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。
实践五
编程的时候接口优于实现。
实践六
底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。
题目四
Enumeration接口和Iterator接口的区别有哪些?
1.速度
Enumeration速度是Iterator的2倍。
2.内存
Enumeration比Iterator占用更少的内存。
3.安全
Enumeration安全性远远低于Iterator,因为当集合里面的对象正在被Iterator遍历的时候,其他线程无法修改对象。
4.可操作
Enumeration不允许调用者删除底层集合里面的元素,Iterator可以。
题目五
HashSet和TreeSet有什么区别?
区别一
底层存储的数据结构不同。HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储。
区别二
有序性不同。HashSet是无序的,而TreeSet是有序的。
区别三
存储时保证数据唯一性依据不同。HashSet是通过复写hashCode()方法和equals()方法来保证数据唯一性的,而HashSet通过Compareable接口的compareTo()方法来保证数据唯一性的。
区别四
时间复杂度不同。HashSet的add()、remove()和contains()方法的时间复杂度是0(1),TreeSet的时间复杂度是0(logn)。
题目六
Java中垃圾回收有什么目的?垃圾回收的时机是什么?
目的
识别并且丢弃应用不再使用的对象来释放和重用资源。
时机
1.程序员可以手动调用gc,但是Java语言规范并不保证GC一定会执行。
2.当应用程序空闲时,即没有应用线程在运行时,GC会被调用。
3.Java堆内存不足时,GC会被调用。
题目七
System.gc()和Runtime.gc()的作用是什么?
这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。GC本身是会周期性的自动运行的,由JVM决定运行的时机,现在的版本有多种更智能的模式可以选择,还会根据运行的机器自动去做选择。
题目八
finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
在释放对象占用的内存之前,垃圾收集器会调用对象的finalize()方法。
目的是回收某些对象,清理内存,一般建议在该方法中释放对象持有的资源。
题目九
如果对象的引用被置为null,占用内存将在何时被回收?
在下一个垃圾回收周期,这个对象将是可被回收的。
题目十
Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
JVM的堆是运行时数据区,所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自动内存管理系统也就是垃圾收集器回收。
堆内存是由存活和死亡的对象组成的。存活的对象是应用可以访问的,不会被垃圾回收。死亡的对象是应用不可访问尚且还没有被垃圾收集器回收掉的对象,一直到垃圾收集器把这些对象回收掉之前,会一直占据堆内存空间。