集合理论知识

集合理论知识

首先集合的父类就是Collection,但是一般不会用这个,而是用相应的子类,这样是为了可读性

List(list是有序的(存储有序),可重复的,可以有空值,有索引,可以重写equals方法)

1.LinkedList:底层是双链表实现的存储,超出以后会增长100%,因为双链表的特点,每个数
据节点都会有两个指针,分别指向前一个节点和后一个节点,所以随便从那个节点
开始都可以方便查找到所有节点,这也是为什么LinkedList增删效率高的原因,就
是因为他增删时相当于只是生成了一个新的节点,并且改变前后节点的引用,并不
改变位置。
特点:查询修改效率低,增删效率高,线程不安全。

2.ArrayList:底层是用数组实现的,开始有一个固定大小的数组,超出以后会增长50%,
ArrayList增删效率低的原因是因为数组是一种队列的数据结构,增删了一个新数据
那么后面的所有数据都要移动。
特点:查询修改效率高,增删效率低,线程不安全。

3.Vector:底层也是数组实现的,但是和ArrayList不同的是,他的方法都加了同步检查,也就是
同步锁,所以他是线程安全的,但是也是因为加了同步锁的原因,效率也会低。

4.总结:其实添删改查的效率也不是绝对的,也要看情况,情况不同效率也会有变换。

Set(set是无序的(存储有序),不可重复,可以有空值,只能有一个,并且其实现类都不是线程安全的,无序指的是没有下标)

1.LinkedHashSet:底层是哈希算法和链表,是一个不可重复,但是有序(存储有序)的集合,
因为哈希表是保证唯一性的,但是没有先后顺序,这时候就通过链表来记录
元素的先后顺序,达到一个存取有序的效果。
特点:不可重复的,有序的(存储有序)。

2.HashSet:底层是用了哈希算法,需要注意的是在HashSet中判断两个对象是否想等要用
equalas和HashCode方法,并且要两个都为true,才为相等。
特点:不可重复,无序的,查询修改较快,少量的插入也是比较快的。

3.TreeSet:底层是红黑树(平衡二叉树),是一个不可重复的,但是排序的集合,
他的底层有一种特殊的排序方法,会对存储的元素默认从小到大排序,比如Integer
就是对比数值的大小,并且去重。这个排序分两种,一种是默认的自然排序,要
实现Comparable接口,重写compareTo方法,但是有些系统类是默认实现了的。
还有一种比较器排序,要用集合的构造器接受一个实现了Comparator接口的子类
对象,重写compare方法。
特点:不可重复的,排序的。

4.EnumSet:枚举集合,主要是存储枚举类型的对象

Queue(一个队列接口,一个先进先出的容器)

1.PriorityQueue:底层就是队列,是一个比较标准的队列实现类,按照队列大小顺序排序,
经实践总是将最小值排在首位,其他方法同LinkedList相同,其实LinkedList也
是实现了Queue接口,另外不管何时删除,都只会删除最小的一个元素。
特点:高效的删除最小元素,排序的。

2.ArrayQueue:底层是居于数组实现的队列,在队列中存着两个指针,指向头部和尾部

Map(将键映射到值的对象,一个映射不能包含重复的键;每个键最多只能映射到一个值)

1.HashMap:jdk1.8之前底层是桶+链表,是一种链表散列的数据结构,并且是以键
值对存储的,键不能重复因为数组存储区间连续,占用内存严重,但是寻找地址容
易,插入删除麻烦,链表存储区间分散,占用内存比较宽松,但是寻找麻烦,但是
插入删除容易。
但是因为值是链表结构,所以数据量大的情况下查询效率就会很低,所以在jdk1.8
以后,新加了一个红黑树,当链表长度大于8时就会变成红黑树。
另外HashMap当存储的长度大于默认的数组长度时,就会进行扩容,因为java数组
是不支持自动扩容的,所以只能创建一个更大的新的数组
HashMap是线程不安全的,并且他的键是不排序的,但是存储是有序的,每一个
数组元素对应一个链表。
hash数组的默认大小是11,当hash数组的容量超过初始容量0.75时,增加的方式是
old*2+1。

2.TreeMap:底层是通过桶+红黑树的实现方法,数据结构是数组,数组中的每一个元素又对应一
个红黑树,其实基本和HashMap没有很大区别,唯一的区别就是TreeMap的键是会
自动排序的。

3.HashTable:是线程安全的,原因是因为他内部的方法都加了Synchronize关键字,但是不推荐
用这个了,有线程性能优化更好的ConcurrentHashMap。

4.ConcurrentHashMap:jdk1.5以后加入的,实现原理是segment段锁来保证线程的安全,性能
也更好。

5.LinkedHashMap:底层结构是链表+哈希表实现,存储有序

6.WeakHashMap:是一个弱键集合,就是不会强制检索有没有值,key和value都可以是null

结尾:其实补充这些理论知识,只是为了在不同的场景合理的使用对应的集合,以达到规范并且性能最优的结果。

你可能感兴趣的:(Java面试,java)