logo头像
Snippet 博客主题

集合

集合

collection

类型:List, Set, Map,都是接口而非具体实现。

1. List - 排列有序,可重复,允许多个NULL

特点是有序并且按线性方式存储,可以根据元素的下标进行精准的控制。
  1. ArrayList 是顺序表的体现,底层用数组实现。

基于动态 数组实现,
读取速度快,增删慢;

1
2
3
数组在线性表中的分类属于顺序表,

即:顺序表中的数据元素存储是连续的,内存划分的区域也是连续的。
  1. LinkedList 是链表的体现,使用双向链表实现。(链表的三种形式:单向链表、双向链表、循环链表)

基于双向链表实现,只能顺序访问,

所以查询速度慢,但插入和删除元素快。

不仅如此,LinkedList 还可以用作栈、队列和双向队列。(JDK1.6之前为循环链表,JDK1.7取消了循环)

1
2
3
链表在物理存储上通常是非连续、非顺序的方式存储的,

但是数据元素的逻辑顺序是连续的,实现方式是通过链表中的引用来实现。
  1. Stack 是 Vector 的子类,而Vector实现了List接口;是栈结构的代表。

和 ArrayList 类似,但它是线程安全的

1
2
3
4
5
栈和队列是特殊的线性表,或者说是受到限制的线性表,

其限制是仅允许在线性表的尾部进行添加和删除操作,

这一端被称为栈顶,另一端称为栈底。

2. Queue - 先进先出

队列Queue直接继承自Collection接口,是队列结构的代表,使用链表结构实现。
1
2
3
4
5
Queue接口是队列的体现,在实现上是基于链表实现的,具体的实现类是LinkindList,

也就是说,java通过Queue接口收窄了LinkedList的访问权限,

只提供从队尾,队头等的操作,从而实现了对列。

(注:Queue继承自Collection接口,而LinkedList实现了Deque接口,Deque接口继承自Queue接口,即实现了Queue接口的所有方法)

Queue接口的主要方法:
add, offer(添加元素),
poll(返回并删除队列头部元素)。
根据offer()方法的官方注解,更加推荐使用offer()方法:

  • LinkedList:可以用它来实现双向队列。
  • PriorityQueue:基于堆结构实现,可以用它来实现优先队列。

3. Set - 唯一,不重复

直接继承自 Collection 接口,HashSet 内部使用HashMap实现;
特点是无序但是不包含重复的元素;
元素存放方式为散列存放,即通过计算hash值存放元素。

  • HashSet:(无序,唯一)基于哈希表实现、无序,值允许为 null ,查找的时间复杂度为 O(logN)
  • TreeSet:(有序,唯一)基于红黑树实现、自然序,值不为 null 值,查找的时间复杂度为 O(1)
  • LinkedHashSet:具有 HashSet特性,增加双向链表维持元素的顺序,有序(插入顺序)

4. Map - 键值对存储,键名唯一,键值可重复

Map单独为一个接口,
HashMap 是基于哈希表的对Map接口的实现,
而哈希表的底层数据结构是数组和链表;

特点是能够根据 key快速查找value;
键必须唯一,
put一个键相同的值时该键会被更新,
即同一个键只能映射到一个值。
键值对以Entry类型的对象实例存在(注:Entry是Map接口中定义的内部接口)

  • HashMap:基于哈希表实现。底层用数组+单向链表(1.8增加了黑红树)存储。无序,键名唯一,可为空;键值可重复,可为 null
  • TreeMap:基于红黑树实现。自然序,键值键名都不能为 NULL。
  • LinkedHashMap:拥有 HashMap 的所有特性,增加了双向链表维持元素的顺序,有序(插入顺序)
支付宝打赏 微信打赏

打赏