一、List
List接口的常见实现类一共三个,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下:
- ArrayList:底层数据结构是数组,查询快,增删慢。线程不安全,效率高。
- Vector:底层数据结构是数组,查询快,增删慢。线程安全,效率低。
Vector相对 ArrayList查询慢(线程安全的)
Vector相对LinkedList增删慢(数组结构) - LinkedList:底层数据结构是链表,查询慢,增删快。线程不安全,效率高。
Vector和ArrayList的区别:
- Vector是线程安全的,效率低
- ArrayList是线程不安全的,效率高
- 共同点:都是数组实现的
ArrayList和LinkedList的区别:
- ArrayList底层是数组结果,查询和修改快
- LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
- 共同点:都是线程不安全的
List这三个实现类到底该使用谁?
- 查询多用ArrayList
- 增删多用LinkedList
- 如果都多ArrayList
二、Set
Set接口的常见实现类一共三个,分别为TreeSet、hashSet和linkedhashSet。Set不允许重复元素且没有顺序,只能允许一个null值。
1、hashSet:
- 是基于Hash算法来实现的,功能是能快速查到到检索的对象,hash算法在于速度,查询某个元素是根据hashCode()值计算出存储位置从而找得的
- 不会记住添加顺序.添加顺序位置随机
- 不会添加重复元素,在同一个集合输入相同元素,add()方法返回false,且新元素不会加入
- HashSet类似于HashMap的key,把key封装起来就HashSet,
- HashSet访问元素也是根据hashCode()的值来快速定位
- HashSet比较两个元素相等的标准是通过equals()方法与hashCode( )方法比较的对象返回值相等,但如果两个元素的equals相等,hashCode()不相等也是会添加成功
2、linkedhashSet:
- 也是根据hashCode()来访问元素位置,但同时使用链表来维护元素的次序,使元素维持插入的顺序保存起来,遍历输出后也是按照添加顺序输出
- 也不允许集合元素重复。
- 因为需要维持元素的插入顺序,性能比HashSet低
- 访问Set里的全部元素有很好的性能,因为它以链表来维护顺序
3、TreeSet:
- 要求内部元素实现Comparable接口
- 使用树结构实现(红黑树),集合中的元素进行排序
- 其中自然排序与自定义排序
三、Map
Map接口的常见实现类有HashMap和HashTable。
Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2。虽然Hashtable比HashMap出现的早一些,但是现在Hashtable基本上已经被弃用了。而HashMap已经成为应用最为广泛的一种数据类型了。造成这样的原因一方面是因为Hashtable是线程安全的,效率比较低。
它们之间的区别如下:
- 父类不同:HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary。
- 线程安全性:Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步。HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。
- 初始容量不同:Hashtable的初始长度是11,之后每次扩充容量变为之前的2n+1(n为上一次的长度)。而HashMap的初始长度为16,之后每次扩充变为原来的两倍。
- 计算哈希值的方法不同:Hashtable直接使用对象的hashCode。而HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。