写在以前:
这篇文章是本身面试过程当中,总结出来的关于Java集合类的总结。每次面试以前来出来看看,速度快,也能很迅速的回忆一些细节问题。发布这篇文章,不单单是但愿你们“临阵磨枪”,更但愿你们可以以此学习其内在原理。毕竟,源码才是最正确的。java
问题汇总:
1.ArrayList
- 实现方式:数组;
- 超出容量的话,增长50%,使用System.arraycopy()复制到新的数组;
- 默认容量为10
- get()和set()性能很高,可是add()/remove()性能差。
2.LinkedList
- 实现方式:双向循环链表;
- 没有容量限制;
- get()和set()性能差,可是add()/remove()性能很快。
3.Vector
- 与ArrayList相似
- 线程同步
- 使用Iterator方式遍历
- 自动增加原来一倍的数组长度
4.HashMap
- 实现方式:Entry[]数组实现的哈希桶数组;
- 初始容量为16,填充因子为0.7,扩容为2倍
- 用Key的哈希值取模桶数组的大小可获得数组下标;
- 计算hash对key的hashcode进行了二次hash,以得到更好的散列值,而后对table数组长度取摸
- Entry用一个next属性实现多个Entry以单向链表存放;
- JDK8里,当一个桶里的Entry超过8后,就不以单向链表而以红黑树来存放以加快Key的查找速度。
5.HashMap和HashTable区别
- HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。
- HashTable不容许null值(key和value都不能够) ;HashMap容许null值(key和value均可以)。
- HashTable有一个contains(Objectvalue)功能和containsValue(Objectvalue)功能同样。
- HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。
- HashTable中hash数组默认大小是11,增长的方式是old*2+1;HashMap中hash数组的默认大小是16,并且必定是2的指数。
- 哈希值的使用不一样,HashTable直接使用对象的hashCode; HashMap从新计算hash值,并且用与代替求模。
6.Collection和Collections的区别
- java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操做的通用接口方法。Collection接口在Java 类库中有不少具体的实现。Collection接口的意义是为各类具体的集合提供了最大化的统一操做方式。
- java.util.Collections 是一个包装类。它包含有各类有关集合操做的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
7.HashMap为何容量是2的幂次
8.hashCode和equals方法的关系
- equals相等,hashcode必相等;hashcode相等,equals可能不相等。
9.Java集合类框架的基本接口
- Collection:表明一组对象,每个对象都是他的子元素;
- Set:不包含重复元素的Collection;
- List:有序的Collection,能够包含重复元素;
- Map:将key映射到value的对象,key不能重复。
10.Enumeration接口与Iterator接口的区别
- Enumeration接口比Iterator速率的2倍
- Iterator线程比Enumeration安全