1. List与Set的区别?
- 都是Collection接口
- List特点:元素有放入顺序,可重复
- Set特点:元素放入无顺序,不可重复(虽然元素无放入顺序,但元素位置由hashcode决定,其实是固定的)
- List的三个实现类:LinkedList、ArrayList、Vector
- Set的两个实现类:HashSet(底层HashMap)、LinkedHashSet
2. HashSet如何保证不重复?
保存元素时,会先对比hash值,如果相等,再对比equal, 如果相等,就不存。如果不等,则存。底层用hashmap实现。
3. HashMap为什么不是线程安全的?
- 线程如果在resize时读取,会读取到空值。
- 扩容时会形成环,从而形成死循环
具体细节:http://www.importnew.com/22011.html
4. HashMap扩容简单过程描述?
先扩大Table,然后会对链表重新hash,顺序会变成逆序。
5. HashMap1.7和1.8的区别,1.8做了什么优化?
- 1.7版本:1.7使用Entry数组存数据,如果hash值相同的话,会将数值放到链表。
- 1.8版本:1.8使用Node数组,Node可能是链表或红黑树(key < 8时是链表,key > 8时是红黑树)
1.8的关键点:实现compare方法,如果实现不正确,1.8会慢于1.7。
6. 强、软、弱、虚引用
- 强引用:只要引用存在就不会被回收。new 出来的对象
- 弱引用:非必须引用,内存溢出前回收。SoftReference
- 软引用:垃圾回收发现后就会回收。WeakReference
- 虚引用:垃圾回收时回收,无法通过引用取到对象值,用于追踪垃圾回收过程。PhantomReference。