Java集合Collection常用知识点归纳
关系图解
一、常用集合分类
-
Collection
-
List 接口 extends Collection< E> :元素按进入先后有序保存,可重复(单列集合)
- ArrayList 接口实现类 extends AbstractList< E> implements List< E>
特点: 数组, 随机访问, 没有同步, 线程不安全 - LinkedList 接口实现类 extends AbstractSequentialList< E> implements List< E>, Deque< E>,
特点: 链表, 插入删除, 没有同步, 线程不安全 - Vector 接口实现类 extends AbstractList< E>
implements List< E>
特点:数组, 同步, 线程安全- Stack 是Vector类的子类 extends Vector< E>
- ArrayList 接口实现类 extends AbstractList< E> implements List< E>
-
Set接口 extends Collection< E> : 元素内部无序,不重复,不能通过索引获取元素值
-
HashSet 接口实现类 extends AbstractSet< E>
implements Set< E>,
特点:使用hash表(数组)存储元素- LinkedHashSet 接口实现类 extends HashSet< E>
implements Set< E>,
特点:链表维护元素的插入次序,有序
- LinkedHashSet 接口实现类 extends HashSet< E>
-
TreeSet extends AbstractSet< E>
implements Set
特点:底层实现为二叉树,元素排好序
-
-
Map 接口,键值对的集合(双列集合)
-
Hashtable extends Dictionary<K,V>
implements Map<K,V>,
特点:接口实现类, 同步, 线程安全 -
HashMap extends AbstractMap<K,V>
implements Map<K,V>,
特点:接口实现类 ,没有同步, 线程不安全-
LinkedHashMap extends HashMap<K,V>
implements Map<K,V>特点: 双向链表和哈希表实现
-
WeakHashMap extends AbstractMap<K,V>
implements Map<K,V> -
TreeMap extends AbstractMap<K,V>
基于 NavigableMap实现红黑树
红黑树对所有的key进行排序
-
-
-
二、List和Set集合详解:
-
1.list和set的区别:
-
2. List详解:
- (1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
ArrayList的底层数据结构就是一个数组,数组元素的类型为Object类型,对ArrayList的所有操作底层都是基于数组的
- (2)LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
- (1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
> LinkedList 底层是基于双向链表实现的,也是实现了 List 接口,
所以也拥有 List 的一些特点(JDK1.7/8 之后取消了循环,修改为双向链表
- (3)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
3. Set详解
-
Set 集合特点: 无序,不重复
- HashSet:
- 底层是一个Hash表(元素为链表的数组)
- hashCode() 和 equals()
- 如何保证hashSet里元素的唯一性
- 先执行hashCode(), 不同直接添加
- 如果相同再执行equals() 相同就不添加,不同就直接添加
- 线程不安全,多线程
- LinkedHashSet:
- LinkedHashSet底层数据结构采用链表和哈希表共同实现,
- 链表保证了元素的顺序与存储顺序一致,有序,哈希表保证了元素的唯一性。
- 线程不安全,效率高。
- TreeSet:
- 底层数据结构是红黑树(是一个自平衡的二叉树)
- 元素唯一且已经排好序, 多线程,线程不安全;
- 唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。
- 根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;比较器排需要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法;
4. Set 和 List的总结
- Set和List都是继承Collection接口, Map不是
- List的特点: 有序,可重复,
- Set的特点: 无序,不可重复
- List和Set的区别:
- List 查询快,插入删除元素效率低,因为会引起其他元素位置改变,它的遍历可以用迭代器也可以通过for循环遍历下标,
- Set 查询慢,插入删除快(查询移动指针, 插入删除是直接申请的内存空间),插入和删除不会引起元素位置改变,Set只能通过迭代器遍历。
5. ArrayList与LinkedList的区别和适用场景
-
Arraylist:
-
优点: ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。
-
缺点:因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。
-
LinkedList:
-
优点: LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,- - LinedList比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景
缺点:因为LinkedList要移动指针,所以查询操作性能比较低。 -
总的来说,链表实现的底层查询慢,增删快,数组实现的底层查询快,增删慢。
-
TreeSet 是二叉树(红黑树的树据结构)实现的,TreeSet中的数据是自动排好序的,不允许放入null值
-
HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束
适用场景分析:HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。为快速查找而设计的Set,我们通常都应该使用HashSet,在我们需要排序的功能时,我们才使用TreeSet。
三、 Map详解
- .Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。
(1)
-
Map 没有继承 Collection 接口, Map 提供 key 到 value 的映射,你可以通过“键”查找“值”。一个 Map 中不能包含相同的 key ,每个 key 只能映射一个 value 。 Map 接口提供 3 种集合的视图, Map 的内容可以被当作一组 key 集合,一组 value 集合,或者一组 key-value 映射。
-
Map的主要方法:
-
HashMap和HashTable的比较:
-
TreeMap:
-
小结:
-
HashMap 非线程安全
-
HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。
-
TreeMap:非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。
6. 适用场景分析:
-
HashMap和HashTable:HashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。HashTable同步的,而HashMap是非同步的,效率上比HashTable要高。HashMap允许空键值,而HashTable不允许。
- HashMap:适用于Map中插入、删除和定位元素。
- Treemap:适用于按自然顺序或自定义顺序遍历键(key)。
-
线程安全集合类与非线程安全集合类
- LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
- HashMap是非线程安全的,HashTable是线程安全的;
- StringBuilder是非线程安全的,StringBuffer是线程安全的。
-
数据结构
- ArrayXxx:底层数据结构是数组,查询快,增删慢
- LinkedXxx:底层数据结构是链表,查询慢,增删快
- HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
- TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序
最后
Collection的下属知识点非常多,慢慢吸收,时不时回顾看一看,系统的学习比零散的学更有效果。