java中的集合

java中的集合有哪些

java中的集合分为Collection和Map两类
Map接口和Collection接口是所有集合的父接口
Collection接口的子接口包括:Set接口和List接口
1、Map接口的实现类主要有:HashMap、TreeMap、HashtableLinkedHashMap、ConcurrentHashMap以及Properties等
2、Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
3、List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

线程安全的集合

  • Vector
  • Stack(继承自Vector)
  • HashTable
    不安全
  • ArrayList

Collection

在这里插入图片描述

1、ArrayList和LinkedList区别

  • ArrayList底层是数组,查找容易,增删难
  • LinkedList底层是循环双向链表(1.6之前有循环,1.7之后取消了循环)查找慢,增删快
  • ArrayList比LinkedList增删效率高的情况
    • 但是当ArrayList的增删在末尾进行时(每次执行remove()和add())时,效率比LinkedList快
    • 如果删除操作的位置是在中间。由于 LinkedList 的消耗主要是在遍历上,ArrayList 的消耗主要是在移动和复制上(底层调⽤的是 arrayCopy() ⽅法,是 native ⽅法)。LinkedList 的遍历速度是要慢于 ArrayList 的复制移动速度的如果数据量有百万级的时,还是 ArrayList 要快。

2、HashMap底层原理

JDK1.7之前是Entry数组+链表,主要是通过拉链法解决冲突,HashMap通过key经过扰动函数处理后得到hash值,然后通过(n - 1) & hash判断当前元素存放的位置(n为数组的长度),若该位置没有元素,则直接插入,否则迭代该处元素链表,并依次比较其key的hash值,如果两个hash值相等且key相等,则用新Entry的value覆盖原来节点的value,如果hash值相等但key不相等,则将该节点插入链表的头部
JDK1.8之后是Entry数组+链表/红黑树,相较于之前的版本,1.8在解决哈希冲突时有了较大的改变,当链表长度大于阈值(默认为 8)时,会首先调用 treeifyBin()方法。这个方法会根据 HashMap 数组来决定是否转换为红黑树。只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是执行 resize() 方法对数组扩容。

2.1 HashMap的put方法执行过程
  • 1.7之前
    • 如果定位的位置没有元素直接插入
    • 如果定位的位置有元素,遍历以这个元素为头节点的链表,依次和插入的链表比较,如果key相同就用新Entry的value覆盖原来节点的value,如果不同,用头插法插入元素
  • 1.8之后
    • 如果定位的位置没有元素直接插入
    • 如果定位到的数组位置有元素就和要插入的 key 比较,如果 key 相同就直接覆盖,如果 key 不相同,就判断 p 是否是一个树节点,如果是就调用e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value)将元素添加进入。如果不是就遍历链表插入(插入的是链表尾部)。
      • 直接覆盖之后应该就会 return,不会有后续操作。
      • 当链表长度大于阈值(默认为 8)并且 HashMap 数组长度超过 64 的时候才会执行链表转红黑树的操作,否则就只是对数组扩容。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值