java基础详解-集合

一、集合组成

  java集合主要由MapCollection组成,Collection主要类图如下(图片来源于网络,懒得画图)

 

  从上图中能很明显的看出来Collection下主要是SetListQueue,上图主要涉及SetList,某些不常用的集合,比如Queue还有ArrayDequePriorityQueue等实现类,Vector子类StackSetEnumSet也未见展示

  Map接口主要类图如下

Map主要分为了HashMapHashtableTreeMap,另外的WeakHashMap等应用场景不多,ConcurrentHashMap等属于java.util.concurrent下子类,MapIdentityHashMapEnumMap等未见展示

二、常用场景:

Java常用集合一般适用场景:

Collection

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

Collection继承了Iterable接口,实现这个Iterable接口的对象允许使用foreach进行遍历,也就是说,所有的Collection集合对象都具有“foreach可遍历性。这个Iterable接口只有一个方法: iteratorjava8之后多了forEachSpliterator两个default方法,在此不多展开),它返回一个代表当前集合对象的泛型<T>迭代器,用于之后的遍历操作

 

ListList集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引

ArrayList:类似一个长度可变的数组 ,它封装了一个动态的增长的、允许再分配的Object[]数组。适合查询,不适合增删

LinkedList:底层是双向循环链表,实现List接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素。同时它还实现Deque接口,即能将LinkedList当作双端队列使用,自然也可以被当作栈来使用。适合增删,不适合查询。

VectorVectorArrayList在用法上几乎完全相同,线程安全

StackStackVector提供的一个子类,用于模拟这种数据结构(LIFO后进先出)

 

Set:元素无序,不可重复,Set判断两个对象相同不是使用“==”运算符,而是根据equals方法。也就是说,我们在加入一个新元素的时候,如果这个新元素对象和Set中已有对象进行注意equals比较都返回false,则Set就会接受这个新元素对象,否则拒绝。

HashSet:根据对象的哈希值确定元素在集合中的位置

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

TreeSet: 实现了对集合中的元素排序

 

Map:双列集合的根接口,用于存储具有键(key)、值(value)映射关系的元素,不能出现重复的键key,即同一个Map对象的任何两个key通过equals方法比较结果总是返回false

HashMap:用于存储键值映射关系,两个key通过equals()方法比较返回true、同时两个keyhashCode值也必须相等

LinkedHashMapLinkedHashMap也使用双向链表来维护key-value对的次序,该链表负责维护Map的迭代顺序,与key-value对的插入顺序一致(注意和TreeMap对所有的key-value进行排序进行区

)

TreeMapTreeMap可以保证所有的key-value对处于有序状态。

Hashtable:不常用,线程安全的hashmap,性能不及ConcurrentHashMap

 

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

PriorityQueuePriorityQueue并不是一个比较标准的队列实现,PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按照算法优先级进行重新排序

DequeDeque接口代表一个双端队列,双端队列可以同时从两端来添加、删除元素,因此Deque的实现类既可以当成队列使用、也可以当成栈使用

 

三、常见问题

Collection Collections 的区别

  Collectionjava.util下的接口,它是各种集合结构的父接口,继承于它的接口的主要有setList,提供关于集合的一些操作,比如插入、删除、判断一个元素是否是其成员,遍历等

  Collectionsjava.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换等操作

 

Tags: