java集合类总结

保姆级教程:不用看古早代码,5分钟搞懂泛微ecology9附件存储与接口调用 本文详细解析了泛微ecology9附件存储与接口调用的核心原理,提供从基础概念到实战操作的完整指南。通过拆解文档化附件设计理念、解析RESTful接口参数,并给出Python代码示例,帮助开发者快速掌握附件上传与业务集成的关键技巧,提升二次开发效率。 阅读详情

HashMap

HashMap中的属性:

1.capacity:容量,Node数组的大小(桶的数量),值为2的N次幂
2.threshold:扩容阈值,等于capacity * load factor 当size大于此值时进行扩容
3.loadFactor:负载因子,默认为0.75f
4.size属性是指map中的键值对个数
5.initialCapacity hashMap初始化时设置的容量大小(Node数组的长度),initialCapacity = (需要存储的元素个数 / 负载因子) + 1,如果可以确定要存储的键值对个数可以通过该公式计算出
容量,然后threshold如果暂时无法确定初始值大小,请设置为16(即默认值)。如果,需要放置1024个元素,由于没有设置容量初始大小,
随着元素的不断增加,容量7次被迫扩大,resize需要重建hash,严重影响性能。
官方的建议是initailCapacity设置成2的n次幂;。

HashMap常见问题:

阿里巴巴开发规范中,推荐用户在初始化HashMap时,应指定集合初始值大小。
一、原因
当我们new一个HashMap没有对其容量进行初始化的时候,系统会默认创建一个16大小的集合。当我们使用的集合太小时,就会造成内存的浪费,而当HashMap的容量超过临界值时,HashMap就会扩容到下一个2的指数幂(2->4,4->8,8->16)。扩容(resize)时,HashMap会重新建立hash表,重新计算没个元素的位置,这是很消耗资源的。
二、合理的设置
当我们使用HashMap(int initialCapacity)来初始化容量的时候,jdk会默认帮我们计算出一个相对合理的值当做初始容量。当HashMap的容量值超过了临界值(threshold)时就会扩容,
threshold = HashMap的容量值0.75,比如初始化容量为8的HashMap当大小达到80.75=6时将会扩容到16。当我们设置HashMap的初始化容量是遵循expectedSize(预期大小)/0.75+1,比如expectedSize是6时 6/0.75+1=9,此时jdk处理后会被设置成16,大大降低了HashMap被扩容的几率。
当我们通过HashMap(int initialCapacity)设置初始容量时,HashMap不一定会采取我们设置的初始容量,会根据计算得到一个新的值(2的指数幂),以保证hash的效率。
PS.为什么容量一定要是2的指数幂?
简答:1.节约空间 2.让元素分布均匀,put和get获取map数组小标方式 h & (length-1),h:为插入元素的hashCode,length:为map长度;&:与操作,如果length为2的次幂 则length-1
转化为二进制必定是11111……的形式,再与h的二进制与操作效率会非常的快,而且空间不浪费;
如果length不是2的次幂,比如length为15,则length-1为14,对应的二进制为1110,再与h与操作,最后一位都为0,而0001,0011,0101,1001,1011,0111,1101这几个位置永远都不能存放元素了,空间浪费相当大,更糟的是这种情况中,数组可以使用的位置比数组长度小了很多,这意味着进一步增加了碰撞的几率,
减慢了查询的效率!这样就会造成空间的浪费。

ArrayList

初始时构造可以设置(initialCapacity参数)集合的大小,来避免多次的扩容浪费性能。
由数组组成,新增的时候如果空间不够 1.5倍数进行扩容,原数组数据通过Arrays.copyWrite到新的数组中
遍历的时候不能做修改操作,否则会抛异常,遍历的时候会记录当前的modCount,以为做修改操作会改变modCount值,比较发现改变抛出异常!

CopyOnWriteArrayList

CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,
而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,
再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。
所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

当每次添加一个元素时才动态扩展数组大小为1.每次扩展为size()+1; 这里不管数组大小是否足够,每次都会新建一个数组,大小为原数组+1。
注意到没,每次添加元素时都会复制原数组,在原数组上+1,进行添加元素。
在添加的时候加锁,但是读取元素时读取的还是老数组,所以读不用加锁,不影响读的问题。但是缺点也很明显,就是在某一个时刻内存中会多了一个数组,随着list的数组量多时,在添加一个元素时,内存会一倍的被占用。

数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。
读的时候不需要加锁,因为读取到时候读的是array数组。如果这个时候有数据添加或者删除,操作的都是新数组,并不会影响到我们读。

Set和List的重要区别:不重复

HashSet 基于HashMap实现、非线程安全,初始化时初始化一个hashMap,存储key是传入的value,value是object
CopyOnWriteArraySet 基于CopyOnWriteArrayList 线程安全
ConcurrentSkipListSet 基于ConcurrentSkipListMap 线程安全,有序,查询快

Open3D (C++) KD tree的使用【2025最新版】 Open3D (C++) KD tree的使用,博客长期更新,本文最近更新时间为:2025年1月6日。 阅读详情

相关推荐

Ubuntu 24.04下Loki+Alloy+Grafana日志分析系统的快速部署与实践

本文详细介绍了在Ubuntu 24.04系统上快速部署Loki+Alloy+Grafana轻量级日志分析系统的完整流程。通过二进制安装Loki、配置Alloy采集器以及设置Grafana可视化界面,构建了一套资源消耗低、易于管理的日志解决方案,并实战演示了如何采集和分析网络设备日志,特别适合资源有限的中小团队或边缘计算场景。

tensor9flow的博客 238

Java面试专项——集合专题一(ArrayList)--万字读懂ArrayList底层原理

集合是JAVA重点中的重点也是面试官必会提问的一点,通常涉及到集合的面试题通常呈现以下几点:难度大、粒度细、重底层、涉及数据结构等基础知识。 本专题首先复习集合框架涉及到的数据结构基础知识,然后系统地回顾Java集合框架,最后解读一下涉及到Java集合的经典高频面试题。 一、数据结构回顾 二、集合框架回顾 如上图所示,集合分为两大类(Collection与Map),其中List接口与Set接口是Collection众多子接口中的两个。也可以说JAVA集合分为三大类---List、Set、M.

qq_42681787的博客 2277

八路抢答器____一个作品的制作思路

学习了解到一个产品制作完全由一个人去采购,设计,仿真,画PCB。不光是需求的分析还有实现功能时如何搭建电路,和给出一个简单高效的设计方法也是至关重要的。

weixin_73690807的博客 1526

Java-字符容量-capacity()方法:

Java-字符容量-capacity()方法: package com; import java.util.HashMap; /** * Java字符容量capacity()方法: * * Java字符容量计算:比如StringBuffer sb=new StringBuffer("Good");输出sb.capacity();长度为20, * * 因为StringBuffer在为对象分配长度的时候,起始会分配一个字,也就是两个字节长度即(16位), * * 每增加一个字符,长度就会在16

qq_43617838的博客 7093

SIwave仿真手册——电源完整性仿真之PDN阻抗的提取(四)

(想不到我这个弱鸡的博主有一天也有被催更的时候,看到后台被催的消息,我慌了,赶紧写一篇把。) 文章目录3.1 PDN阻抗的提取3.1.1手动完成PDN阻抗的提取1、创建pin group2、创建端口3、数据文件的清理和检查(参考1.3.4&1.3.5)4、添加电容模型(参考2.2.1)(==这一步很重要==)5、开始仿真6、查看仿真结果3.1.2利用向导工具完成PDN阻抗的提取1、点击图标![在这里插入图片描述](https://img-blog.csdnimg.cn/36d974339ea5449

luohuo9844的博客 1万+

BES (恒玄)HFP通话笔记

1.audio_developer 调试:SDK 需要打开某个算法,需要原厂打开对应宏定义编译出新的SDK,只要涉及到lib库里的功能都需要原厂手动修改编译。开发商和原厂FAE做起来都会比较累。如果没有原厂支持根本没法做,很少文档,SDK也很多问题,没法开箱即用如果要支持audio_developer上位机调试,还需改代码,如果对整个原理不清楚就没法做,没文档只能啃代码调试工具设计的也有待加强,串口通讯调试对耳机这类产品非常麻烦,本来板子就不大,还要焊接一堆线,调试还要拖着串口线。

飞天鱼 690

java初始化参数_java – HashMap初始化参数(load/initialcapacity)

关于负载系数,我只是引用从HashMap javadoc:As a general rule, the default load factor (.75) offers a good tradeoff between time and space costs. Higher values decrease the space overhead but increase the lookup cos...

weixin_30340301的博客 528

abapGit 安装与初始化完整指南:从 on-premise 到 SAP BTP ABAP environment 的一条龙实践

本文为ABAP开发者提供abapGit从安装到团队协作的完整指南。内容涵盖社区版ZABAPGIT的on-premise安装、Eclipse ADT插件配置、BTP环境使用及常见网络问题处理。重点包括:获取最新构建的安装步骤、EN语言环境的重要性、ADT插件安装方法、以及如何实现on-premise与BTP间的代码迁移。文中特别强调企业环境下代理设置、证书配置等注意事项,并提供实际操作案例,如将RAP业务对象迁移到BTP环境。文末附有可复用的实施清单,帮助开发者快速落地abapGit。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 420

Java性能优化的45个细节

转自:https://mp.weixin.qq.com/s/AiMz62n3pMOPLfWx-0KmHQ 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并发访问; 控制实例的产生,以达到节约资源的目的; 控制数据共享,在不建立直接关联的条件下...

hxt的博客 352

12. Web安全—渗透测试用例—敏感信息泄漏

12. Web安全—渗透测试用例—敏感信息泄漏

weixin_43567873的博客 415

ApolloScape 数据集:YOLOv10 + UI界面实现与应用

是由百度Apollo团队发布的一个大规模自动驾驶数据集,涵盖了车辆、行人、骑行者等多种交通元素,旨在为自动驾驶技术的发展提供丰富的数据支持。数据集包含多种复杂的场景,例如城市道路、交叉口、车辆聚集等,能够帮助研究人员和开发者在多种现实环境下测试和验证目标检测模型。YOLO(You Only Look Once)系列算法是目前最流行的目标检测算法之一,因其高效、准确以及实时性强的特点被广泛应用于计算机视觉领域。YOLOv10是YOLO系列中的最新版本,在性能和效率上进行了多方面的优化。速度快。

YOLO 933

JAVA之HashMap详解

HashMap 基于哈希表的 Map 接口实现,是以 key-value 存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的 key、value 都可以为 null,此外,HashMap 中的映射不是有序的。jdk1.8 之前 HashMap 由数组 + 链表组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的 hashCode 方法计算的哈希值经哈希函数算出来的地址被别的元素占用)而存在的(“拉链法”解决冲突)。

励志成为一名优秀的全能型软件开发工程师。 2328

真题库系列之 CCF GESP 2025年12月认证 Python 1级真题含正确答案与解析

学生通过计算机基础知识的学习,了解计算机的构成与操作,以及计算机的发 展历程。通过编程基础知识以及语句的掌握,可以独立完成简单功能的顺序结构、 分支结构、循环结构的程序。

iCloudEnd的博客 320

Java——集合类

Java 集合类是用于存储和操作数据的核心工具,主要分为Collection和Map两大接口体系,每个接口下有多种实现类。

weixin_44762713的博客 667

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java 常用集合类总结

在平常的代码开发中,集合类是经常会使用到的,比如用于列表缓存的ArrayList,用于做映射关系的Map等等 最近重点看了下java集合类的层次继承关系和内部存储结构,做个总结以便后面可以随时翻翻。        java中的集合,不管是List,Set,还是Map,都是继承自collection接口,这个接口主要定义了集合类的一些公关方法,比如isEmpty(), remove(),

peterzhihua的博客 4442

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java中有哪些集合类?常用的几种java集合类总结 详细解读 Java 的集合类

Java 的集合框架是一个统一的架构,用于表示和操作一组对象。它提供了多种接口和类,遵循了一定的设计原则,具备更高的灵活性和可扩展性。Collection:集合的根接口。List:有序集合,允许重复元素。Set:不允许重复元素的集合。Map:键值对集合,键唯一但值可以重复。Queue:用于表示数据结构中的队列。Java 集合类框架为开发者提供了强大的工具,以方便有效地操作数据。通过理解每种集合接口及其实现的特性,可以帮助我们在开发过程中做出更好的选择。

智通全网络工作室的博客 2099

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

java集合类_Java集合类详解

Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMapCollection接口Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。Java SDK不提供直接继承自Collection的类,...

weixin_39955953的博客 214

Java集合类的概述

前述   复习一下Java中的集合类,是面试笔试中常考察的一个点,特地做的整理。 什么是集合类?   集合类,也叫容器类。Java集合类可以用来存储数量庞大的对象。   我们和数组进行对比:   数组:存储基本数据类型,数据类型单一,长度固定,不能动态增大容量。   集合:存储的即可是基本类型的值,也可以是对象,可以存储多种数据类型,长度可变,可以动态增大容量。 Ja...

weixin_30420305的博客 227

一文搞定Java集合类,你还在为Java集合类而烦恼吗?

常用集合类

轻松玩编程 1189

Java中的集合类

目录 集合类 Collection List Set Map 集合类 我们都知道数组,数组中存放了相同数据类型的数据,数组一旦定义好,数组的长度就不可变化了。但是如果我们需要保存一个可以动态变化的数据(在编译时无法确定具体的数量),java的集合类就是一个很好的设计方案了。 集合类位于 java.util 包下,集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。 Java...

谢公子的博客 1968

Java集合类

1 前言 Java实用类库中提供一套相当完整的容器类来保存数据对象,其中基本类型有List、Set、Queue和Map;这些对象类型也称为集合类; 对于每种集合类都有自身一些特性;如:Set对于每个值都只保存一个对象;Map是允许你将某些对象与其他一些对象关联起来的关联数组,Java容器类都可以自动调整自己的尺寸; 2 基本概念 Java容器类类库的用途是“保存对象”,并将其划分为两个

worthliu的博客 424

Java集合类的总结

Java的集合类(Collection Classes)是Java Collections Framework的一部分,提供了一套数据结构和算法,用于存储和操作一组对象。是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素。JDK 不提供此接口的任何直接实现,它提供更具体的子接口(如Set和List)实现。List集合的概述有序集合,这里的有序指的是存取顺序用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素。

m0_58866615的博客 1395

Java集合类面试题

参考答案它基于hash算法,通过put方法和get方法存储和获取对象。存储对象时,我们将K/V传给put方法时,它调用K的hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用 equals()方法确定键值对。

qq_45270148的博客 1363

Java中集合类的详解

Java中集合类的详解 1、集合的概述 2、集合的结构图 3、集合的分类 3.1、Collection集合 3.1.1、List接口 3.1.2、Set接口 3.2、Map集合 3.2.1、HashMap类 3.2.2、Hashtable类 3.3.3、TreeMap类

friend_X的博客 408

Java 集合类详解

通过本篇技术博客的介绍,我们了解了 Java 语言中常用的集合类的概念、分类、使用方法和最佳实践。在实际开发中,集合类是非常重要的数据结构,熟练掌握集合类的使用方法和最佳实践能够提高程序的性能和可读性,推荐大家多加练习和实践。

hj1993的博客 1842

Java的集合类介绍

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。Java基础部分算法与编程数据库部分流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

2401_83817916的博客 1010
上一篇: reentrantLock、readWriteLock、AQS
下一篇: java并发线程工具类
一切还来得及
博客等级 码龄11年 50粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值