java集合分类:
java集合主要分为三大类:
1、List(有序、可重复)
List里存放的对象是有序
的,同时也是可以重复
的,List关注的是索引
,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。
2、Set(无序、不能重复)
Set里存放的对象是无序
,不能重复
的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
3、Map(键值对、键唯一、值不唯一)
Map集合中存储的是键值对
,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合
,对set集合进行遍历,得到相应的值。
ArrayList规则:
1.
底层是以数组进行存储
2.初始化默认容量为10
3.每次添加元素时,都要进行检查是否需要扩容
4.扩容后,需要将数组中的数据拷贝到新数组当中
5.线程是不安全的
6.删除和添加
某一个元素时,需要移动
后面的其他元素,并且更改size(所以修改操作较慢)
LinkedList规则:
1.底层是以
双向链表
的结构进行存储
2.每一个数据使用Node节点
进行存储,指向前一个元素和后一个元素
3.LinkedList 查找过程要稍麻烦一些,因为没有索引,要从头或者从尾进行查找
TreeSet和TreeMap规则:
注意: TreeSet底部是以TreeMap的键为规则实现的
1.底层存储是以红黑树结构
存储
2.红黑树是一种自平衡的二叉树
3.存储的数据可以进行自动排序
说明:排序规则我们可以使用自定义规则:自然排序(实现Comparable接口)
或者使用比较器排序(Comparator)
可以通过实现排序的方式,让数据重复放入
实现排序方式
HashSet和HashMap的规则:
注意: 注意: HashSet底部是以HashMap的键为规则实现的
1.HashMap的默认容量是16
,是一种懒加载
,第一次添加元素的时候才会进行创建
2.HashMap的默认加载因子是0.75
,当到达这个值的时候,容量会乘以2
,进行扩容,这样可以减少进行hash碰撞
hash冲突
3.HashMap的底层是以数组+链表+红黑树
的结构进行存储的
4.默认存储结构是数组,当hash值,进行冲突的时候抢位置,这时候这个数据位置上的结构会转换为链表,当链表的长度>=8时,如果数组长度<64,则会进行扩容,如果数组长度>=64,,这时候会转换为红黑树结构
注意:使用自定义类,hash码,需要重写hashcode和equals方法
HashMap之put方法流程:
第一步:判断键值对数组table[i]是否为空/null,是则执行resize()扩容。
第二步:根据键key计算hash值得到插入数组的索引i,如果tab[i]== null则直接插入,执行第六步;如果tab[i] != null,执行第三步。
第三步:判断tab[i]的第一个元素与插入元素key的hashcode&equals是否相等,相等则覆盖,否则执行第四步。
第四步:判断tab[i]是否是红黑树节点TreeNode,是则在红黑树中插入节点,否则执行第五步。
第五步:遍历tab[i]判断链表是否大于8,大于8则可能转成红黑树(数组需要大于64),满足则在红黑树中插入节点;否则在链表中插入;在遍历链表的过程中如果存在key的hashcode&equals相等则替换即可。
第六步:插入成功,判断hashmap的size是否超过threshold的值,超过则扩容