java 集合

java 集合一、java集合:1.collection接口的子接口:set接口跟list接口2.map接口的实现类:hashMap、hashTable、concurrentHashMap、hashTable、

大家好,又见面了,我是你们的朋友全栈君。

一、java集合:

1.collection接口的子接口:set接口跟list接口

2.map接口的实现类:hashMap、hashTable、concurrentHashMap、hashTable、treemap;

3.set接口的实现类:hashSet、LinkedHashSet、treeSet;

4.List接口的实现类:ArrayList、LinkedList、vector等;

<span role="heading" aria-level="2">java 集合

 

 

二、java集合详细说明:

 

1.List:

 

         ArrayList:  有序、非线程安全、值可以为null、值可以重复,底层实现Object数组,它实现了Serializable接口,因此它支持序列化;

       优点:查询快,插入、删除慢;

 

          ArrayList的动态扩容

 

 

       linkedList:有序、非线程安全、底层实现是链表,插入、删除快,查询效率不高;

      vector:跟ArrayList结构相似,死线程安全的,加了synchronized;

2.Map:

     HashMap:

          底层实现原理:jdk1.8之前,hasMap是数组+链表;jdk1.8之后,数组+链表+红黑树,当链表超过8的时候,链表就会转化为红黑树,利用红黑树快速增、删、改、查的特点提高HashMap的性能; 

        entry数组包含 key、val、hash值、next对象;

          <span role="heading" aria-level="2">java 集合

 

 

 

         <span role="heading" aria-level="2">java 集合

 

加载因子loadFactory:默认为0.75,初始化容量initialCapacity:默认为16,加载因子存在的原因:为了减少哈希冲突,如果初始桶为16,等到满16个元素才扩容,某些桶里可能就不止一个元素了,所以加载因子默认为0.75,也就是说大小为16的HashMap, 到了第13个元素就会扩容成32;

 阀值threshold:一般为capacity*loadFactory;扩容的时候会用到阀值;

<span role="heading" aria-level="2">java 集合

 

当发生哈希冲突,并且元素数量大于阀值的时候,就会扩容,扩容时需要创建一个为之前数组长度2倍的新的数组,然后将当前的Entry数组中的元素全部传输过去;

<span role="heading" aria-level="2">java 集合

 

 旧的数组的大小如果已经最大(2^30)了,那么将不再扩容,将阀值设定为int的最大值;如果没有,那就初始化一个原来数组长度两倍的新的数组,将数据转移到新的数组;

     concurrentHashMap:

         concurrentHashMap的数据结构

     在jdk1.7之前是segment数组+hashEntry数组,segment实际继承自可重入锁(ReentrantLock),在concurrentHashMap中扮演锁的角色,hashEntry则用于存储键值对数据,一个concurrentHashMap包含一个segment数组,一个segment包含一个hashEntry数组,称为table,每个HashEntry是一个链表结构的元素;

               <span role="heading" aria-level="2">java 集合

 

 在get和put操作中,是如何快速定位元素放在哪个位置的

                对于某个元素而言,一定是存放在某个segment下的某个table元素中:

定位segment:取得key的hashcode值,进行一次再散列,拿到散列值后,以再散列值的高位进行取模,得到当前元素在哪个segment上;

定位table:取得key的再散列值,用再散列值的全部和table的长度进行取模,得到当前元素在table的哪个元素上;

       

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154506.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python分类模型_nlp模型评估指标

    python分类模型_nlp模型评估指标不知道你是否已经看完了我之前讲过的有关机器学习的文章,如果没看过也没关系,因为本篇文章介绍的内容适用于所有分类模型(包括神经网络),主要就是介绍分类模型的评估指标。另外,在前面我还会提一下数据不平衡的问题该如何处理。总之本篇文章实用性极强!…

    2022年10月6日
    0
  • 微信小程序 小程序源码包括后台完整版分享

    微信小程序 小程序源码包括后台完整版分享需要的留邮箱免费发!版权归作者所有,任何形式转载请联系作者。作者:执波仔丶(csdn博客)最新收集的60个微信小程序源码分享+开发视频教程最新收集的60个微信小程序源码分享+开发视频教程最新收集的60个微信小程序源码分享+开发视频教程小程序源码使用教程(源码文件夹自带安装教程,本教程不一定通用):第一步:百度搜索下载微信开发者工具(最新1.02.1801081,支持mac)第二步:打开开发工具客…

    2022年7月20日
    20
  • h2数据库教程_NoSQL数据库入门

    h2数据库教程_NoSQL数据库入门范培忠2017-06-19  H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。  H2最大的用途在于可以同应用程序打包在一起发布,这样可以非常方便地存储少量结构化数据。  它的另一个用途是用于单元测试。启动速度快,而且可以关闭持久化功能,每一个用例执行完随即还原到初始状态。  H2的第三个用处是作为缓存,作为NoSQL的一个补充。当某

    2022年10月12日
    0
  • next和nextLine的区别

    next和nextLine的区别内容纯属总结,和CSDN上的很多搜索情况内容大致相同,都是正确可靠的。第一种情况:nextline()在前面,next()在后面privatestaticvoidt1(){Strings1,s2;Scannerscanner=newScanner(System.in);System.out.println("请输…

    2022年5月27日
    34
  • WebStorm 2021.11.3激活码(注册激活)

    (WebStorm 2021.11.3激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月29日
    86
  • java序列化和反序列化以及序列化ID的作用分析

    java序列化和反序列化以及序列化ID的作用分析java序列化和反序列化以及序列化ID的作用分析

    2022年6月18日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号