CollectionSummary

集合框架

集合框架是为表示和操作集合而规定的一种统一的标准的体系结构,提供了一套性能优良使用方便的接口和类,位于java.util包中,Java中的集合框架主要分为两部分:Collection和Map。

Collection和Map

1.Collection是单列集合,只能存储一种类型的元素;Map是双列集合,使用键值对存储元素,键与值一一对应。
2.Collection下是List、Set、Queue(极少使用)子接口;Map下是AbstractMap和SortedMap子接口。

List和Set

1.List接口实现类中存储有序可重复的元素,Set接口实现类中存储无序不可重复的元素。
2.List和数组相似,可以动态增长,会影响其他元素的位置改变,查找和修改快,增删慢;Set查找和修改慢,增删快,插入和删除不会引起元素位置改变。
3.List接口的主要实现类有ArrayList、LinkedList、Vector;Set接口的主要实现类有HashSet、TreeSet、LinkedHashSet。
4.List的实现类可以存储多个null,Set的实现类最多只能包含一个null。

ArrayList、LinkedList、Vector

1.存储结构:ArrayList和Vector底层为数组,默认的初始容量都为10,因此增删元素时会改变元素位置;LinkedList(JDK1.6之前为循环链表,JDK1.7取消了循环)底层为双向链表,增删元素时不会改变元素位置。
2.线程安全性:ArrayList和LinkedList是线程不安全的,Vector使用了synchronized锁,线程是安全的,但效率比ArrayList和LinkedList低。
3.扩容机制:ArrayList在JDK1.6之前,扩容后的容量是之前的1.5倍+1,JDK1.6后是之前的1.5倍;Vector默认扩容机制为2倍;LinkedList是采用链表存储方式,对容量没有要求,不需要扩容。
4.ArrayList查找和修改快,增删慢;LinkedList查找和修改慢,增删快;Vector查找、修改、增删都慢。

HashSet、TreeSet、LinkedHashSet

1.HashSet由HashMap实现,底层为哈希表;TreeSet由TreeMap实现,底层为红黑树;LinkedHashSet继承于HashSet,是HashSet的一个“扩展版本”,会保持插入顺序。
2.三者都不是线程安全的。
3.HashSet,TreeSet不能有序增删元素,LinkedHashSet可以有序增删元素。
4.HashSet,LinkedHashSet允许有null元素,TreeSet不允许有null元素。
5.TreeSet可实现自动排序,HashSet、LinkedHashSet不能自动排序。
5.由于Set实现类大部分是由Map实现类实现,扩容机制与对应的Map实现类一致。

HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap、HashTable

1.以上都是Map接口的实现类。
2.HashMap、LinkedHashMap、TreeMap线程不安全,ConcurrentHashMap、HashTable是线程安全的。
3.底层结构:

  • HashMap在JDK1.8之前为数组+链表,JDK1.8后为数组+链表+红黑树,当链表长度大于阈值(默认为8)时,将链表转化为红黑树。
  • LinkedHashMap继承自HashMap,底层结构与之相似,额外持有一个双向链表,维护插入节点的顺序。
  • TreeMap底层为红黑树。
  • ConcurrentHashMap在JDK1.7时为分段的数组+链表,JDK1.8后为数组+链表+红黑树。
  • HashTable底层为数组+链表。

4.扩容机制:

  • HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍,也就是容量大小为2的n次方。
  • LinkedHashMap继承自HashMap,扩容机制与HashMap一致。
  • ConcurrentHashMap相当于HashMap的线程安全版本,扩容机制与HashMap一致。
  • HashTable被ConcurrentHashMap取代,现在极少使用,默认的初始容量为11,每次扩充,容量变为原来的2倍+1。

5.HashMap中,允许一个键为null,多个键所对应的值为null;而HashTable中键和值只要有一个为null就会产生NullPointException。
6.实现线程安全的方式中,ConcurrentHashMap在JDK1.7时使用的是Segment(实现了ReentrantLock可重入锁)分段锁,JDK1.8后取消了Segment分段锁,采用CAS(compare and swap,比较交换,乐观锁)和synchronized来保证并发安全;HashTable使用的是同一把锁。

Collection和Collections

1.Collection是Java中所有集合类(接口)的顶级接口,提供了对集合对象进行基本操作的通用接口方法,List和Set都继承了Collection接口。
2.Collections是操作集合的工具类,提供了一系列的静态方法,用于对集合中元素进行排序、搜索及线程安全等操作。

List和Set的区别

List中的元素有序可重复,Set中的元素无序不可重复。

ArrayList和LinkedList以及Vector的区别

1.ArrayList和LinkedList线程不安全,Vector线程安全。
2.ArrayList和Vector底层是数组,LinkedList底层是链表。
3.ArrayList查找和修改快,增删慢;LinkedList查找和修改慢,增删块;Vector查找、修改、增删都慢。

HashSet和TreeSet以及LinkedHashSet区别

1.HashSet底层由哈希表实现,TreeSet底层由二叉树实现,LinkedHashSet底层由链表实现。
2.HashSet打印输出时无序,TreeSet和LinkedHashSet打印输出时有序。

HashMap和TreeMap,HashTable的区别

1.HashMap和TreeMap是线程不安全的,HashTables是线程安全的。
2.HashMap和HashTable底层是哈希表,TreeMap底层是红黑树。

ConcurrentHashMap,HashMap的区别

1.ConcurrentHashMap线程安全,HashMap线程不安全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值