集合类总结 2018-09-08

List

List接口直接继承Collection

特点:元素有序,可以重复,可以为空

ArrayList

https://www.cnblogs.com/skywang12345/p/3308556.html

ArrayList本质上是一个动态数组

实现了RandomAccess接口,提供了随机访问功能,实际上就是通过下标序号进行快速访问。

实现了Cloneable接口,即覆盖了函数clone(),能被克隆。

实现了Serializable接口,支持序列化,也就意味了ArrayList能够通过序列化传输

默认容量10,可以自定义,最大容量Integer.MAX_VALUE - 8,最终可以扩容值Integer.MAX_VALUE
增加数据导致容量不足时,容量默认增加上次容量大小的一半

优势:快速的随机访问,对于经常需要根据索引位置访问集时,效率较高

劣势:向指定索引位置插入或者删除对象时,效率较低,因为插入或删除会移动插入位置后的元素

非线程安全

获取安全的ArrayList:

Collections.synchronizedList(new ArrayList());
CopyOnWriteArrayList()

LinkedList

https://www.cnblogs.com/skywang12345/p/3308807.html

LinkedList 本质上是链表,允许元素为 null

LinkedList 实现 List 接口,能对它进行队列操作。

LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。

LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。

LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。

LinkedList 是非同步的。

获取线程安全的LinkedList

Collections.synchronizedList(new LinkedList<>());
ConcurrentLinkedQueue

优势:在List中间进行插入和删除的代价较低

劣势:LinkedList在随机访问方面相对比较慢

Vector

https://blog.csdn.net/chy555chy/article/details/52275648
Vector 可实现自动增长的对象数组。 可以存放null

Vector 是矢量队列,它是JDK1.0版本添加的类。继承于AbstractList,实现了List, RandomAccess, Cloneable这些接口。

Vector 继承了AbstractList,实现了List;所以,它是一个队列,支持相关的添加、删除、修改、遍历等功能。

Vector 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在Vector中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。

Vector 实现了Cloneable接口,即实现clone()函数。它能被克隆。

Vector 实现java.io.Serializable接口,Vector,能通过序列化去传输。

Vector中的操作是线程安全的。

Stack

Stack是Vector的一个子类,它实现了一个标准的后进先出的栈。

Set

https://blog.csdn.net/qq_33642117/article/details/52040345

不会存储重复的元素,无序

对象的相等性

引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方法,会得到相同的结果, 如果对象所属的类没有覆盖Object的hashCode方法的话,hashCode会返回每个对象特有的序号(java是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。 如果想要让两个对象视为相等的,就必须覆盖Object继下来的hashCode方法和equals方法,因为Object hashCode方法返回的是该对象的内存地址,所以必须重写hashCode方法,才能保证两个不同的对象具有相同的hashCode,同时也需要两个不同对象比较equals方法会返回true

HashSet

能存入null

部使用HashMap来存储数据,数据存储在HashMap的key中,value都是同一个默认值

因为实现的是Set接口,所以不允许有重复的值

插入到HashSet中的对象不保证与插入的顺序保持一致。对象的插入是根据它的hashcode

HashSet中允许有NULL值

HashSet也实现了Searlizable和Cloneable两个接口

线程安全的HashSet

Collections.synchronizedSet(new HashSet())
CopyOnWriteArraySet

LinkedHashSet

LinkedHashSet继承自HashSet,唯一的区别是LinkedHashSet内部使用的是LinkHashMap

LinkedHashSet中的元素顺序是可以保证的

非线程安全的集合

线程安全的LinkedHashSet

Collections.synchronizedSet(new LinkedHashSet())

SortedSet

该SortedSet的接口扩展集Set并声明了一组按升序排序的行为

不能存null

TreeSet

https://www.cnblogs.com/skywang12345/p/3311268.html

https://www.cnblogs.com/xujian2014/p/5334937.html

TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。

TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。

TreeSet 实现了Cloneable接口,意味着它能被克隆。

TreeSet 实现了java.io.Serializable接口,意味着它支持序列化。

TreeSet是一个有序集合,可以按照任何顺序将元素插入该集合,当对该集合进行迭代时,各个值将自动以排序后的顺序出现。
TreeSet中的元素按照升序排列,缺省是按照自然顺序进行排序,
自定义排序意味着TreeSet中的元素要实现Comparable接口,或者有一个自定义的比较器Comparator

TreeSet的排列顺序必须是全局顺序,也就是说任何两个元素都是必须可比的,同时只有当他们比较相同时才返回0

TreeSet底层使用的是TreeMap,不能存放null

TreeSet非线程安全

线程安全的TreeSet

Collections.synchronizedSortedSet()

EnumSet

https://blog.csdn.net/wxc880924/article/details/52624887

EnumSet 是一个专为枚举设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,
该枚举类型在创建EnumSet时显式或隐式地指定。

EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序

EnumSet在内部以位向量的形式存储,这种存储形式非常紧凑、高效,因此EnumSet对象占用内存很小,而且运行效率很好

EnumSet集合不允许加入null元素

Queue

https://www.cnblogs.com/lemon-flm/p/7877898.html

一个队列就是一个先入先出(FIFO)的数据结构

内置的不阻塞队列: PriorityQueue 和 ConcurrentLinkedQueue

PriorityQueue 和 ConcurrentLinkedQueue 类在 Collection Framework 中加入两个具体集合实现。
PriorityQueue 类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)
或者根据传递给构造函数的 java.util.Comparator 实现来定位。
ConcurrentLinkedQueue 是基于链接节点的、线程安全的队列。并发访问不需要同步。
因为它在队列的尾部添加元素并从头部删除它们,所以只要不需要知道队列的大 小,       
ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。收集关于队列大小的信息会很慢,需要遍历队列。

五个阻塞队列类

ArrayBlockingQueue :一个由数组支持的有界队列。

在构造时需要指定容量, 并可以选择是否需要公平性,如果公平参数被设置true,等待时间最长的线程会优先得到 处理(其实就是通过将ReentrantLock设置为true来 达到这种公平性的:即等待时间最长的线程会先操作)。通常, 公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。它是基于数组的阻塞循环队 列,此队列按 FIFO(先进先出)原则对元素进行排序。

LinkedBlockingQueue :一个由链接节点支持的可选有界队列。

LinkedBlockingQueue的容量是没有上限的(说的不准确,在不指定时容量为Integer.MAX_VALUE,不要然的话在put时怎么会受阻呢), 但是也可以选择指定其最大容量,它是基于链表的队列,此队列按 FIFO(先进先出)排序元素。

PriorityBlockingQueue :一个由优先级堆支持的无界优先级队列。

是一个带优先级的队列,而不是先进先出队列。元素按优先级顺序被移除,该队列也没有上限(PriorityBlockingQueue是对 PriorityQueue的再次包装,是基于堆数据结构的,而PriorityQueue是没有容量限制的,与ArrayList 一样,所以在优先阻塞 队列上put时是不会受阻的。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError),但是如果队列为空,那么取元素的操作take就会阻塞,所以它的检索操作take是受阻的。另外,往入 该队列中的元 素要具有比较能力。

DelayQueue :一个由优先级堆支持的、基于时间的调度队列。

(基于PriorityQueue来实现的)是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll将返回null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时,则出现期满,poll就以移除这个元素了。 此队列不允许使用 null 元素。

SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。

Map

map储存数据的形式是一个key和一个value对应,不能包含重复的kay

HashMap

在JDK 7 中,HashMap的数据结构是数组+链表;

在JDK 8 中,HashMap的数据结构由数组+链表变为数组+(链表或者rbtree)

HashMap的key、value都可以为null

在HashMap中key使用不可变对象String、Integer http://www.importnew.com/13384.html

HashMap不是线程安全的

获取线程安全的 HashMap

Hashtable
ConcurrentHashMap
Synchronized Map

LinkedHashMap

https://www.cnblogs.com/xiaoxi/p/6170590.html

继承HashMap

过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序。该迭代顺序可以是插入顺序或者是访问顺序。

Key和Value都允许空

非线程安全

Hashtable

key、value都不可以为null

线程安全

SortedMap

SortedMap接口主要提供有序的Map实现

TreeMap

https://blog.csdn.net/u012099869/article/details/52662216

TreeMap 是一个有序的key-value集合,基于红黑树(Red-Black tree)实现。
该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

  1. 当未实现 Comparator 接口时,key 不可以为null,否则抛 NullPointerException 异常;
  2. 当实现 Comparator 接口时,若未对 null 情况进行判断,则可能抛 NullPointerException 异常。

TreeMap是非同步的

IdentityHashMap

底层是一个Object数组
key可以重复,IdentityHashMap只有在key完全相等(同一个引用),才会覆盖

你可能感兴趣的:(集合类总结 2018-09-08)