1. Comparable接口与Comparator接口的区别?
Comparable接口:只提供一种排序方式;提供一个方法compareTo();在java.lang包中;实现此接口的类会被修改。
Comparator接口:可提供多种排序方式;提供一个方法compare();存在于java.util包中;实现此接口的类不会被修改。
2. final、finally、finalize的区别?
final是关键字,可用于修饰变量、方法、类;被修饰的变量不能修改、方法不能重写、类不能继承。
finally:finally块用于异常控制中,总是会被执行。
finalize:finalize()方法用于垃圾收集,此方法在对象被垃圾收集时调用,用于执行一些清除工作。
3. 能使List、Set、Map元素同步吗?
可以,可以使用Collections工具类。
public static List synchronizedList(List l) {}
public static Set synchronizedSet(Set s) {}
public static SortedSet synchronizedSortedSet(SortedSet s) {}
public static Map synchronizedMap(Map m) {}
public static SortedMap synchronizedSortedMap(SortedMap m) {}
4. 如何使用集合类只读?
使用下面的方法:
Collections.unmodifiableList(list);
Collections.unmodifiableSet(set);
Collections.unmodifiableMap(map);
5. 什么是WeakHashMap?
一个具有弱Key的基于Map实现,其中的项会自动被删除。
6. 什么类实现了List接口?
有三个类:
ArrayList:可修改大小的数组实现,存储有序,非线程安全。
Vector:ArrayList的线程安全实现,方法被synchronized封装。
LinkedList:同时实现了Queue接口,中间的插入和删除操作性能优于ArrayList。
7. 什么是UnsupportedOperationException?
用于表示不被支持操作的异常,常用于集合框架(java.util.Collections)中,UnmodifiableCollection会抛出这个异常,当执行添加和移除操作时。
8. 什么是gc()?
gc()是一个守护线程,gc()方法定义在System类中,用于向JVM发送垃圾收集的请求。
9. List和Set的区别?
List可存重复值,而Set不行。List保证存取顺序而Set不行。JDK中说HashSet不保证迭代顺序恒久不变,而LinkedHashSet可预知迭代顺序。
10. 什么是垃圾收集?
垃圾收集是获取运行时不用对象的过程。为了内存管理而运行。
11. Collections类和Arrays类是什么?
Collections类和Arrays类是工具类,用于支持集合框架核心类。它们提供有用的方法:只读、同步、排序集合框架类等。
Arrays可帮助数组转换为集合对象,Arrays也有一些方法用于帮助一部分数组复制或其它一些功能。
12. 什么是Dictionary类?
Dictionary类提供一些存储键-值对的功能。
13. HashMap和Hashtable的区别?
Hashtable线程安全(synchronized)而HashMap不是。
Hashtable不允许null键和null值,而HashMap无此限制。
遍历方式不同,HashMap采用fail-fast原则的iterator方式,而hashtable采用enumerator方式。
14. 什么是ConcurrentHashMap?
实现Map接口,线程安全。添加和移除同步而获取不同步。
Hashtable是对象锁,ConcurrentHashMap是桶级锁,因此ConcurrentHashMap比Hashtable有更好性能。
15. 不用Vector,如何使ArrayList成为同步的(synchronized)?
使用Collections类。
Collections.synchronizedList(List list);
Collections.synchronizedMap(Map list);
Collections.synchronizedCollection(Collection list);
16. Iterator和Enumeration的区别?
遍历时iterator可以删除集合的元素,而此时集合本身不能添加或删除元素。
Enumeration用于过时的类中,比如:Vector、Stack;而Iterator用于所有现代的集合类中。
方法名不同:Enumeration的hasMoreElement()、nextElement()方法与Iterator的hasNext()、next()方法。
17. Queue和Stack的区别?
队列-先入先出,栈-后进先出。队列可以通过remove()或poll()方法移除一个元素。Stack和Vector是线程安全的。
对于先来先处理的应用,使用Queue,比如工作列表、请求处理。
如果只从一端操作push和pop,使用Stack,比如递归算法。
18. 什么是IdentityHashMap?
IdentityHashMap使用==代替equals()方法判断。这是为了性能问题考虑,可以阻止模仿。
19. 如何排序列表,以相反的顺序?
从Collections.reverseOrder()方法获取一个倒序Comparator对象,然后传递给Collections.sort()方法。
List list = new ArrayList();
Comparator comp = Collections.reverseOrder();
Collections.sort(list, comp);
20. 有哪些实现Set接口的类?
Set是不包含重复(equals方法判断)元素的集合,最多有一个null元素,有如下常用实现:HashSet、SortedSet、TreeSet。
SortedSet是一个扩展Set的接口,这个接口允许数据递增排序或基于Comparable或Comparator接口排序,所有插入这个接口的数据都必须实现Comparable或Comparator接口。
TreeSet实现了SortedSet接口,这个类对于基本操作(添加、移除、包含)的时间复杂度为log(n),这个类不是线程安全的。
HashSet实现了Set接口,基于哈希表实现(一个HashMap实例),它不保证遍历次序,允许null值,常量时间复杂度实现基本操作(add、remove、contains、size),如果哈希算法实现各个元素分散在桶中。
21. 如何使一个集合线程安全?
使用如下方法:
Collections.synchronizedList(list);
Collections.synchronizedSet(set);
Collections.synchronizedMap(map);
22. ArrayList和Vector的区别?
ArrayList非线程安全,Vector线程安全。
内部实现用一个数组,当空间够用时,Vector每次增加1倍,而ArrayList增加50%。
23. finalize()方法的作用?
垃圾收集时调用,用于处理清除工作。
24. 数组和ArrayList的区别?
数组创建固定大小而ArrayList创建可变大小。
数组一旦创建,其元素不能添加和删除,而ArrayList可以动态添加和删除。
ArrayList是一维的,而数组可以是多维的。
创建数组需要预先知道大小,否则可能会造成内存浪费。而ArrayList是动态创建的,则不会有这个问题。