Java集合框架

2021-04-06 11:41:24 浏览数 (1)

Java的集合主要分为Collection和Map两大体系

  • Collection :主要由List、Set、Queue接口组成
  • List代表有序、重复的集合
  • Set代表无序、不可重复的集合
  • Queue为先进先出的队列
  • Map:则代表具有映射关系的键值对(key-value)集合

Collection接口下的简易继承关系图如下:

b1712b236bcf6aa63cea8c3de290e9b7.png

通过对集合框架的分析其主要可以分为如下几个部分

  • 数据结构:List列表、Queue队列、Deque双端队列、Set集合、Map映射
  • 比较器:Comparator比较器、Comparable排序接口
  • 工具类:Collections常用算法类、Arrays静态数组的排序、查找算法
  • 迭代器:Iterator通用迭代器、ListIterator针对 List 特化的迭代器

以下依次简单介绍

1、List

List集合的特点就是存取有序,可以存储重复的元素,可以用下标进行元素的操作。

其主要实现类:ArrayList、LinkedList、Vector、Stack。

1.1、ArrayList

ArrayList就是一个动态数组,支持随机存取,但是插入删除效率很低(需要对数据进行偏移)。当数组空间不足时会自动扩容(创建一个更大的数组,并进行数组复制)。

1.2、LinkedList

LinkedList 是一个双向链表结构,不支持随机存取,只能进行顺序遍历,但由于是链表实现,插入删除效率很高。

1.3、Vector

Vector 也是一个动态数组结构,是一个元老级别的存在。ArrayList 大部分的方法和 Vector 比较相似,两者的主要差别为,Vector 是允许同步访问的,Vector 中的操作是线程安全的,但是效率低,而 ArrayList 所有的操作都是异步的,执行效率高,但不安全。

关于Vector,现在用的很少了,因为里面的get、set、add等方法都加了synchronized,以保持线程同步,降低了效率。

1.4、Stack

Stack是Vector的一个子类,其本质也是一个动态数组,但是他是一个先进后出的栈结构。(可以使用双端队列ArrayDeque代替)

2、Set

Set集合为一个存取无序,且元素不可重复的集合。

其主要实现类:HashSet、LinkedHashSet 和 TreeSet。

HashSet、LinkedHashSet 和 TreeSet都是基于HashMap、LinkedHashMap 和 TreeMap的键(Key)实现的,使用 Map 中键不能重复、无序的特性。其主要的使用都比较类似,只需要重点关注Map即可。

3、Queue

Queue是一个队列集合,队列通常是指“先进先出”(FIFO)的容器。新元素插入到队列的尾部,访问元素操作会返回队列头部的元素。

主要实现类:ArrayDeque、LinkedList、PriorityQueue。

3.1、ArrayDeque

ArrayQueue是一个基于数组实现的双端队列,在队列中存在两个指针,一个指向头部,一个指向尾部,因此它具有队列的方法特性。

3.2、LinkedList

LinkedList是List接口的实现类,也是Deque的实现类,底层是一种双向链表的数据结构。

3.2、PriorityQueue

PriorityQueue也是一个队列的实现类,此实现类中存储的元素排列并不是按照元素添加的顺序进行排列,而是内部会按元素的大小顺序进行排列,是一种能够自动排序的队列。

4、Map

Map是一个双列集合,其中保存的是键值对(Key-Value),键要求保持唯一性,值可以重复。

Map 主要实现类:HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties。

4.1、HashMap

HashMap继承自AbstractMap,底层采用哈希表存储数据,其输入输出顺序基本不一致,HashMap最多只允许一条记录的 key 为 null。

4.2、LinkedHashMap

HashMap 的子类,内部使用链表数据结构来记录插入的顺序,使得输入的记录顺序和输出的记录顺序是相同的。这就是其与HashMap 的不同之处。

4.3、TreeMap

能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历时,得到的记录是排过序的。

4.4、IdentityHashMap

IdentityHashMap继承自AbstractMap,与HashMap有些不同,在获取元素的时候,通过==代替equals ()来进行判断,比较的是内存地址。

4.5、WeakHashMap

WeakHashMap继承自AbstractMap,被称为缓存Map,向WeakHashMap中添加元素,再次通过键调用方法获取元素方法时,不一定获取到元素值,因为WeakHashMap 中的 Entry 可能随时被 GC 回收。

4.6、Hashtable

Hashtable,一个元老级的类,键值不能为空,与HashMap不同的是,方法都加了synchronized同步锁,是线程安全的,导致效率较慢。

4.7、Properties

Properties 继承于 Hashtable,表示一个持久的属性集,属性列表中每个键及其对应值都是一个字符串。

0 人点赞