Java集合类详解

目录(本文基于JDK1.8)


 

 

一、 什么是集合?

集合是一个包含多个元素的对象,或者说是存放数据对象引用的容器。

二、 Java集合类关系

Iterable

Iterable是Collection类的父接口,主要用途是获取迭代器。JDK1.8后新增了default关键字修饰的forEach()方法和spliterator()方法。

1.Collection

Collection是最基本的集合接口,一个Collection代表一组Object的集合,这些Object被称作Collection的元素。Collection是一个接口,用以提供规范定义,不能被实例化使用

1.1 List

List继承自Collection接口,用来存储一组相同类型的元素,List集合代表一个元素有序、可重复的集合,它和Set的区别是:元素有放入顺序,元素可重复 。有顺序,即先放入的元素排在前面

  • ArrayList

    ArrayList是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组。ArrayList在更多元素添加进来时会请求更大的空间,每次对size增长50%。

  • Vector

    Vector和ArrayList在用法上几乎完全相同。但是属于强同步类。Vector在更多元素添加进来时也会请求更大的空间,Vector扩容每次请求其大小的双倍空间。

    • Stack

      Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出)。

  • LinkedList

    LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList。当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义。

1.2 Set

Set继承自Collection接口,用来存储一组相同类型的元素,不能包含有重复元素。它和List的区别是:元素无放入顺序,元素不可重复。无顺序,即先放入的元素不一定排在前面。不可重复,即相同元素在set中只会保留一份

  • HashSet

    HashSet是Set接口的典型实现,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束HashSet使用hash算法来存储集合中的元素,因此具有良好的存取和查找性能。当向HashSet集合中存入一个元素时首先计算元素的hashcode值,然后通过扰动计算和按位与的方式计算出这个元素的存储位置,如果这个位置位空,就将元素添加进去;如果不为空,则用equals方法比较元素是否相等,相等就不添加,否则找一个空位添加。

    • LinkedHashSet

      LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但和HashSet不同 的是,它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,当遍历LinkedHashSet集合里的元素时,LinkedHashSet将会按元素的添加顺序来访问集合里的元素。

  • SortedSet

    实现此接口的子类都属于排序的子类,因为此接口主要用来排序。

    • TreeSet

      TreeSet是SortedSet接口的实现类,它是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。TreeSet的底层是TreeMap的keySet(),而TreeMap是基于红黑树实现的,红黑树是一种平衡二叉查找树,它能保证任何一个节点的左右子树的高度差不会超过较矮的那棵的一倍。TreeSet作为一种Set,它不允许出现重复元素。TreeSet是用compareTo()来判断重复元素的。

  • EnumSet

    一个专门为枚举类设计的集合类,EnumSet中所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式、或隐式地指定。EnumSet的集合元素也是有序的,它们以枚举值Enum类内的定义顺序来决定集合元素的顺序。

1.3 Queue

Queue用于模拟"队列"这种数据结构(先进先出FIFO)。队列的头部保存着队列中存放时间最长的元素,队列的尾部保存着队列中存放时间最短的元素。新元素插入到队列的尾部,访问元素操作会返回队列头部的元素,队列不允许随机访问队列中的元素

  • PriorityQueue

    PriorityQueue类在Java1.5中引入并作为 Java Collections Framework的一部分。 PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。

  • Deque

    Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持FIFO形式也可以支持FILO形式.。

2. Map

Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;建(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值。

2.1 HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。 HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

  • LinkedHashMap

    LinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致。

2.2 HashTable

HashTable 也是一个散列表,它存储的内容是键值对(key-value)映射。 HashTable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。 HashTable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。此外,HashTable中的映射不是有序的。

2.3SortedMap

SortedMap是Map接口派生出的一个子接口。

  • TreeMap

TreeMap就是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。TreeMap存储key-value对(节点)时,需要根据key对节点进行排序。TreeMap是按key排序的,元素在插入TreeSet时compareTo()方法要被调用,所以TreeSet中的元素要实现Comparable接口。

2.4 WeakHashMap

WeakHashMap与HashMap的用法基本相似。区别在于,HashMap的key保留了对实际对象的"强引用",这意味着只要该HashMap对象不被销毁,该HashMap所引用的对象就不会被垃圾回收。 但WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,当垃 圾回收了该key所对应的实际对象之后,WeakHashMap也可能自动删除这些key所对应的key-value对。

2.5 IdentityHashMap

IdentityHashMap的实现机制与HashMap基本相似,在IdentityHashMap中,当且仅当两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等,而HashMap只需要(key.equals(k)),就会认为他们是同一个Entry。

2.6 EnumMap

EnumMap是一个与枚举类一起使用的Map实现,EnumMap中所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式指定它对应的枚举类。EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效。EnumMap不允许使用null作为key值,但允许使用null作为value。如果试图使用null作为key将抛出NullPointerException异常。如果仅仅只是查询是否包含值为null的key、或者仅仅只是使用删除值为null的key,都不会抛出异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值