目录:
文章目录
1、集合概述
1.1、集合?
集合(容器),主要由两类接口派生而来,分别是Collection
和Map
。
Collection主要存放单一元素,子接口List
、Set
、Queue
;Map主要存放key-value对
1.2、集合的特点以及为什么要使用集合
我们需要根据键值获取到元素值时就选用 Map
接口下的集合, 需要排序时选择 TreeMap
,不需要排序时就选择 HashMap
,需要保证线程安全就选用ConcurrentHashMap
;
当我们只需要存放元素值时,就选择实现 Collection
接口的集合,需要保证元素唯一时选择实现 Set
接口的集合比如 TreeSet
或 HashSet
,不需要就选择实现 List
接口的比如 ArrayList
或 LinkedList
.
当我们需要保存一组类型相同的数据的时候,我们应该是用一个容器来保存,这个容器就是数组,但是,使用数组存储对象具有一定的弊端, 因为我们在实际开发中,存储的数据的类型是多种多样的,于是,就出现了“集合”,集合同样也是用 来存储多个数据的。
1.3、集合和数组的区别
1、数据类型:数组既可以存储基本数据类型,又可以存储引用数据类型(基本数据类型存储的是值, 引用数据类型存储的是地址值)集合只能存储引用数据类型(对象), 集合中也可以存储基本数据类型,但是在存储的时候会自动装箱(JDK1.5新特性)变成对象。定义数组时必须指定数组元素类型,集合默认其中所有元素都是Object;
2、长度:数组的长度是固定的,集合长度是可以改变的;
3、获取:无法直接获取数组实际存储的元素个数,length
用来获取数组的长度,但可以通过size()
直接获取集合实际存储的元素个数;
4、实现方式:集合有多种实现方式和不同的适用场合,如List
,Set
,Map
等;而不像数组仅采用分配连续的空间方式;
5、效率:集合以接口和类的形式存在,具有封装,继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂的操作,大大提高软件的开发效率。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xt5p6cOB-1678692402487)(/Users/sunjiabao/Library/Application Support/typora-user-images/image-20230313132027724.png)]
2、Collection
2.1、Set
HashSet
:Set
接口的实现类,线程不安全。 HashSet
的底层数据结构是哈希表(基于 HashMap
实现)。主要用不需要保证元素插、取顺序的场景。
LinkedHashSet
:Set
接口的实现类,线程不安全。 LinkedHashSet
的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。主要用于需要保证元素插、取顺序的场景FIFO。
TreeSet
:Set
接口的实现类,线程不安全。 TreeSet
底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。主要用于支持对元素自定义排序的场景。
2.1、List
ArrayList
:是List
的主要实现类,底层使用 Object[ ]
存储,是线程不同步的,适用于频繁的查找工作,线程不安全 ; ArrayList扩容机制
Vector
是 List
的古老实现类,底层使用 Object[ ]
存储,线程安全的。
LinkedList
(通常是不会用到的,可以用ArrayList替代)底层使用的是双向链表(1.6之前是循环链表,1.7取消了循环)
2.1、Queue
Queue
是单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循 先进先出(FIFO)规则。Queue 扩展了 Collection 的接口。方法有:add(E e)
、remove()
、element()
Deque
是双端队列,在队列的两端均可以插入或删除元素。Deque
扩展了 Queue
方式的不同分为两类,方法有:addFirst(E e)
、addFirst(E e)
、addLast(E e)
、addFirst(E e)
、addLast(E e)
、 getFirst()
、 getLast()
ArrayDeque
与 LinkedList
的区别:
ArrayDeque
和 LinkedList
都实现了 Deque
接口,两者都具有队列的功能。从性能的⻆度上,选用 ArrayDeque
来实现队列要比 LinkedList
更好。此外, ArrayDeque
也可以用于实现栈。
ArrayDeque
是基于可变⻓的数组和双指针来实现,而LinkedList
则通过链表来实现;ArrayDeque
不支持存储NULL
数据,但LinkedList
支持;ArrayDeque
是在 JDK1.6 才被引入的,而LinkedList
早在 JDK1.2 时就已经存在;ArrayDeque
插入时可能存在扩容过程, 不过均摊后的插入操作依然为 O(1)。虽然 LinkedList不需要扩容,但是每次插入数据时均需要申请新的堆空间,均摊性能相比更慢。
**PriorityQueue
**与 Queue
的区别在于元素出队顺序是与优先级相关的,即总是优先级最高的元素先出队。