Java集合概述
Java集合,也叫容器,主要是由两个接口派生来的,
- 一个Collection接口,主要存放单一元素。他有三个子接口
- List
- Set
- Queue
- 一个Map接口,主要存放键值对
说说List、Set、Queue、Map的区别
List(对付顺序):存储的元素有序、可重复
Set(实现独一无二):存储的元素无序、不可重复
Queue(排队):有序、可重复
Map(key搜索):使用键值对(key-value)存储,key无序、不可重复。value无序、可重复,每个建最多映射一个值
集合框架底层数据结构总结
List
- ArrayList:Object[ ] 数组
- Vector: Object[] 数组
- LinkList:双向链表,jdk1.6之前是循环链表
Set:
- HashSet(无序、唯一):基于HashMap实现,底层采用HashMap来保存元素
- LinkedHashSet:LinkedHashSet是HashSet的子类,内部是通过LinkedHashMap来实现
- TreeSet(有序、唯一):红黑树(自平衡的排序二叉树)
为什么要使用集合
当我们需要保存一组类型相同的数据的时候,我们应该用数组保存,但是数组存储对象具有一定的弊端,因为平时开发的时候,存储数据的类型是多种的,于是就出现了集合,集合同样是用来存储多个数据的。
数组的缺点是一旦声明之后,长度就不可变了,同时声明数组的数据类型也就决定了这个数组的存储数据的类型。数组存储的数据是有序的,可重复的,特点单一。但是集合提高了数据存储的灵活性,Java集合不仅可以存储不同类型不同数量的对象,还可以保存具有映射关系的数据。
ArrayList和Vector的区别
ArrayList是List的主要实现类,底层使用Object[] 存储,适用于频繁1查找工作,线程不安全
Vector是List的古老实现类,底层采用Object[] 存储,线程安全
ArrayList和LinkedList的区别
- 是否线程安全:都是不同步的,不保证线程安全
- 底层数据结构:ArrayList是Object数组;ListedList是双向链表
- 插入和删除是否手元素位置的影响:
- ArrayList采用数组存储,所以时间复杂度受到元素位置的影响。
-LinkedList采用链表存储,在头部和尾部插入删除不受元素的影响,但是如果要在指定位置的话,时间复杂度O(n),因为需要先移动到指定的位置再插入。
- ArrayList采用数组存储,所以时间复杂度受到元素位置的影响。
- 是否支持快速随机访问:(通过元素的需要快速获取元素对象)
- ListedList不支持高效的随机元素访问
- ArrayList支持
- 内存空间的占用:ArrayList的空间浪费主要体现在List列表会预留一定的容量空间;LinkedList的空间浪费是体现在他的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)
Collection子借口Set
comparable 和Comparator的区别
- comparable接口实际上是出资java.lang包 他有一个compareTo(Object obj)方法来排序
- comparator接口实际上是出自java.util包,他有一个compare(Object obj1,Object obj2)方法用来排序
一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo()方法
比较HashSet、LinkedHashSet、TreeSet三者的异同
- 三者都是Set接口的实现类,都能保证元素唯一,并且都不是线程安全。
- 主要区别是底层数据结构不同。
- HashSet的底层数据结构是哈希表(基于HashMap实现)
- LinkedHashSet的底层数据结构是链表和哈希表,元素的插入和取出顺序满足FIFO
- TreeSet底层数据结构是红黑树,元素有序,排序的方式有自然排序和定制排序
- 应用场景不同:
- HashSet:不需要保证元素插入和取出顺序
- LinkedHashSet:保证元素的插入和取出满足FIFO
- TreeSet:支持对元素自定义排序规则
COllection子接口Queue
Queue与Deque的区别
Queue是单端队列,只能从一段插入元素,一段删除元素,先进先出
Deque是双端队列,队列的两端均可以插入和删除元素
ArrayDeque和LinkedList的区别
都实现了Deque的接口,两者都有队列的功能
- ArrayDeque是基于可变长的数组和双指针来实现,LinkedList通过链表来实现
- ArrayDeque不支持存储Null数据,LinkedList支持
- ArrayDeque插入可能存在扩容过程,不过均摊后插入操作依然为O(1)。LinkedList不需要扩容,但是每次插入数据都需要申请新的堆空间,均摊性能相比更慢
性能角度考虑,ArrayDeque来实现队列比LinkedList更好
PriorityQueue
元素出队的顺序是与优先级有关的,优先级高的优先出队
- 利用二叉堆的数据结构实现,底层使用可变长的数组来存储数据
- 通过堆元素的上浮和下沉,实现O(logn)的时间复杂度插入元素和删除堆顶元素
- 非线程安全,不支持粗糙你Null和non-comparable对象
- 默认小顶堆,但可以接受Comparator作为构造函数,自定义元素优先级的先后。