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的哪个元素上;

       

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 序列化和反序列化的详解[通俗易懂]

    序列化和反序列化的详解[通俗易懂]一、基本概念1、序列化和反序列化的定义:  (1)Java序列化就是指把Java对象转换为字节序列的过程    Java反序列化就是指把字节序列恢复为Java对象的过程。  (2)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。    反序列化的最重要的作用:根据字节流中保存的对…

  • 常用的数据库的字段类型及大小比较_sql字段长度

    常用的数据库的字段类型及大小比较_sql字段长度Oracle/MSSQL/Mysql 常用数据库的字段类型及大小  ORACLE的数据类型 常用的数据库字段类型如下: 字段类型中文说明限制条件其它说明 CHAR固定长度字符串最大长度2000bytes` VARCHAR2可变长度的字符串最大长度4000bytes可做索引的最大长度749 NCHAR根据字符集而定的固定长度字符串最大长度200…

  • Dreamweaver2021中文版 附安装教程

    Dreamweaver2021中文版 附安装教程当我们访问网站的时候看到的每一个页面都是前端程序员开发的,如果没有一款好的软件则会让开发效率大大降低,那么有没有一款高效的前端开发软件呢?推荐大家使用Dreamweaver2021,这是adobe旗下的一款非常受欢迎的网页设计软件,是该系列的全新版本,可以帮助广大学生、程序员制作出精美的网页,比如简洁的百度首页,复杂的淘宝页面,你都可以通过它让你游刃有余的制作出来。该软件可以帮助用户了解以及编辑HTML、CSS、Web、xml、json,各种前端语言都支持编码输入,还支持快捷键快速输入一大段代码,减少你重复

  • 两个正序数组 找中位数_两个有序数组的中位数

    两个正序数组 找中位数_两个有序数组的中位数原题连接给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5示例 3:输入:nums1 = [0,

  • opencv实现imfill_使用opencv实现matlab中的imfill填充孔洞功能

    opencv实现imfill_使用opencv实现matlab中的imfill填充孔洞功能使用opencv实现matlab中的imfill填充孔洞功能,整体思路如下:1.首先给原始图像四周加一圈全0,并保存为另一幅图像2.使用floodFill函数给新图像进行填充,种子点设置为Point(0,0),填充颜色为全白。因为原始图像四周加了一圈0,因此使用floodFill填充之后,整个图像除了原始图像中内部的点是黑色之外其他地方全是白色。3.将填充之后…

  • Unity3D中Isometric Tilemap功能实践「建议收藏」

    Unity3D中Isometric Tilemap功能实践「建议收藏」前言最近出于兴趣想自己做一个2D的游戏,因为有着C的基础,所以决定使用Unity3D来做。之前对于Unity3D其实了解不多,不过看了一些Unity3D的视频和官方文档后,暂时做起来也没遇到什么

发表回复

您的电子邮箱地址不会被公开。

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