今天公司面试了一个小伙,工作经验3年,Java开发岗,因为没啥面试官的经验就把自己找工作时候的面试题拎出来问了问,明显感觉小伙准备不足,很多面试宝典常见的问题都答不上来。好记性不如烂笔头,自己也记下来吧万一哪天用得上。那么就以JDK1.8为例进行总结吧。
1. ArrayList和LinkedList的联系和区别
联系:
ArrayList与LinkedList都实现了List接口,List接口又继承自Collection接口。两者都不是线程安全的。
区别:
1. 内部实现:ArrayList是基于动态数组的数据结构;LinkedList是基于链表的数据结构
2. 随机访问:ArrayList存取操作时间复杂度为O(1);LinkedList存取需要遍历链表,时间复杂度为O(n)
3. 增删操作:ArrayList增删需要移动数组,时间复杂度为O(n);LinkedList只需要移动指针,时间复杂度为O(1)
深入理解:
深入理解-ArrayList源码解读
2. HashMap和Hashtable的联系和区别
HashMap
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
Hashtable
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
联系:
两者都实现了Map接口
区别:
- HashMap是非线程安全的,Hashtable是线程安全的
- HashMap继承自AbstractMap类,Hashtable继承自Hashtable类
- HashMap是支持null键和null值的,HashTable在遇到null时,会抛出NullPointerException异常
- 可以看到HashTable默认的初始大小为11,之后每次扩充为原来的2n+1;HashMap默认的初始化大小为16,之后每次扩充为原来的2倍
3. HashMap和ConcurrentHashMap的联系和区别
HashMap和ConcurrentHashMap的比较是Java面试中频度非常高的问题,个人认为有必要对两者进行深入理解,尤其是ConcurrentHashMap数据结构设计非常巧妙
深入理解-HashMap源码解读
深入理解-ConcurrentHashMap源码解读
联系:
都是键值对数据结构
区别:
- 底层实现不同
- HashMap是非线程安全的,ConcurrentHashMap是线程安全的
- 所在包不同,HashMap在java.util包中,ConcurrentHashMap在java.util.concurrent包中
4. List和Set的联系和区别
List和Set是最常用的集合类,也是面试中的常见问题。List常用的实现类有ArrayList、LinkedList和Vector;Set常用的实现类有HashSet、LinkedHashSet以及TreeSet
联系:
两者都是接口,并且都继承自Collection接口
区别:
- List中允许有重复的元素,Set中元素是唯一的。元素是否唯一通过对象的equals判断
- List可以通过索引来操作元素,Set不能通过索引
- List会按照插入元素的顺序排序,Set不能保证元素顺序
5. HashSet和TreeSet的联系和区别
联系:
两者都是Set接口的实现类
区别:
- HashSet中元素是无序的,TreeSet可以自然排序或者自定义排序
- 内部实现不同,HashSet底层是哈希表实现的,TreeSet底层是二叉树,是SortedSet的唯一实现类
- HashSet可以放入null,TreeSet元素不能为null
6. HashSet和LinkedHashSet
联系:
LinkedHashSet继承自HashSet
区别:
HashSet内部是通过HashMap实现的,LinkedHashSet内部使用的是LinkHashMap。这样做的意义是LinkedHashSet中的元素顺序是可以保证的,也就是说遍历序和插入序是一致的。
HashSet如何保证元素可以参考 深入理解-HashSet源码解读