List
List接口直接继承Collection
特点:元素有序,可以重复,可以为空
ArrayList
ArrayList本质上是一个动态数组
实现了RandomAccess接口,提供了随机访问功能,实际上就是通过下标序号进行快速访问。
实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
实现了Serializable接口,支持序列化,也就意味了ArrayList能够通过序列化传输
默认容量10,可以自定义,最大容量Integer.MAX_VALUE - 8,最终可以扩容值Integer.MAX_VALUE
增加数据导致容量不足时,容量默认增加上次容量大小的一半
优势:快速的随机访问,对于经常需要根据索引位置访问集时,效率较高
劣势:向指定索引位置插入或者删除对象时,效率较低,因为插入或删除会移动插入位置后的元素
非线程安全
获取安全的ArrayList:
Collections.synchronizedList(new ArrayList());
CopyOnWriteArrayList()
LinkedList
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
不会存储重复的元素,无序
对象的相等性
引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用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
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
EnumSet 是一个专为枚举设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,
该枚举类型在创建EnumSet时显式或隐式地指定。
EnumSet的集合元素也是有序的,EnumSet以枚举值在Enum类内的定义顺序来决定集合元素的顺序
EnumSet在内部以位向量的形式存储,这种存储形式非常紧凑、高效,因此EnumSet对象占用内存很小,而且运行效率很好
EnumSet集合不允许加入null元素
Queue
一个队列就是一个先入先出(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
继承HashMap
过维护一个运行于所有条目的双向链表,LinkedHashMap保证了元素迭代的顺序。该迭代顺序可以是插入顺序或者是访问顺序。
Key和Value都允许空
非线程安全
Hashtable
key、value都不可以为null
线程安全
SortedMap
SortedMap接口主要提供有序的Map实现
TreeMap
TreeMap 是一个有序的key-value集合,基于红黑树(Red-Black tree)实现。
该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
- 当未实现 Comparator 接口时,key 不可以为null,否则抛 NullPointerException 异常;
- 当实现 Comparator 接口时,若未对 null 情况进行判断,则可能抛 NullPointerException 异常。
TreeMap是非同步的
IdentityHashMap
底层是一个Object数组
key可以重复,IdentityHashMap只有在key完全相等(同一个引用),才会覆盖
网友评论