Java集合基础介绍
总体概述
- LIst,Set,Map都是集合接口,LIst和Set继承于Collection接口,Map为独立接口
- List的实现常用集合类实现有ArrayList,LinkedList,Vector
- Set的实现常用集合类实现有HashSet,LinkedHashSet,TreeSet
- Map的实现常用集合类有HashTable(父类是Dictionary),HashMap,LinkedHashMap,TreeMap
- 其实Collection接口下还有个Queue接口
图片来自https://blog.****.net/zhangqunshuai/article/details/80660974
Collection接口特征说明与场景使用
-
List结合
特点:有序,可重复存储
ArryList:
底层数据结构:数组
优点:查询快,增删慢,效率高
缺点: 线程非安全
LinkedList:
底层数据结构:链表
优点:查询慢,增删快,效率高
缺点: 线程非安全
Vector:
底层数据结构:数组
优点:查询快,增删慢,效率低
缺点: 线程安全
面试常问:
ArryList和Vector的区别:
(1)同步性:Vector是线程安全的,即它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不安全的。如果只有一个线程访问集合,那就最好使用ArrayList,因为它是不同步的,效率更高;如果是多个线程访问集合,最好使用Vector,它是线程同步的,这样不用自己去实现同步。
(2)数据增长:ArrayList和Vector都是由初始容量的,当存储量达到了这个初始容量值时,他们就会进行扩容,ArrayList是增长为原来的1.5倍,Vector是增长为原来的2倍(有兴趣去看下源码) -
Set结合
特点:无序,唯一
HashSet:
底层数据结构:Hash表(散列表)
特点:无序,唯一
通过hash()和equals()两个方法来保证唯一性
LinkHashSet:
底层数据结构:链表和Hash表
特点:有序,唯一(先进先出FIFO)
由链表保证有序,hash表保证唯一
TreeSet:
底层数据结构:红黑树
特点:有序,唯一
如何保证元素排序的呢?
自然排序; 比较器排序
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
Conllection集合使用场景
- 数据不唯一(可重复)使用List
- 安全性高,效率低用Vector
- 安全性低,效率高用Array List
- 查询多:ArrayList
- 增删多:LinkedList
- 如果你知道是List,但是不知道是哪个List,就用ArrayList。
- 数据唯一(不能重复)使用Set
- 排序: LinkedHashSet,TreeSet
- 不排序:HashSet
- 如果你知道是Set,但是不知道是哪个Set,就用HashSet。
Map接口特征说明与场景使用
图片来自:https://blog.****.net/zhangqunshuai/article/details/80660974
-
Map
特点:双列存储,key不能重复,value可重复
HashTable:
底层数据结构:数组加链表
特点:线程安全,无序
HashMap:
底层数据结构:数组加链表
特点:线程非安全,无序
LinkedHashMap:
底层数据结构:hash表加链表
特点:链表维持存入或者查询后的有序
TreeMap:
底层数据结构:红黑树
特点:有序
Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。
- TreeMap是有序的,HashMap和HashTable是无序的。
- Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别。
面试常问问题:
HashTable和HashMap的区别:
- Hashtable是线程安全的,HashMap不是线程安全的。 HashMap效率较高,Hashtable效率较低。
- 如果对同步性或与遗留代码的兼容性没有任何要求,建议使用HashMap。
查看Hashtable的源代码就可以发现,除构造函数外,Hashtable的所有 public 方法声明中都有
synchronized关键字,而HashMap的源码中则没有。 - Hashtable不允许null值,HashMap允许null值(key和value都允许)
- 父类不同:Hashtable的父类是Dictionary,HashMap的父类是AbstractMap