001__JAVA集合(List丶Set丶Map)

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的值,超过则扩容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值