美文网首页
集合类总结 2018-09-08

集合类总结 2018-09-08

作者: 冻死的毛毛虫 | 来源:发表于2018-09-08 23:58 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/cvqrgftx.html