JAVA集合汇总

news2024/10/6 4:04:11

数组:
固定长度,从栈中分配空间,对于程序方便快速,但是自由度小。

​优点:下标定位,随机访问性强,查找速度快;

​缺点:插入、删除效率低,内存利用率低,内存空间要求高,必须有足够的连续内存空间。

链表:
​动态进行存储分配,从堆中分配空间,自由度大但是申请管理麻烦。

​优点:插入和删除的效率高,内存利用率高,不会浪费内存;

​缺点:定位查询速度慢,修改慢。

哈希表:

​在JDK1.8版本前:数组 + 链表

​在JDK1.8版本后:数组 + 链表 +红黑树

初始化时,内存默认创建长度为16,加载因子是0.75。

扩容因子值越大,触发扩容的元素个数越多,虽然空间利用率高,但是哈希冲突概率增加。

扩容因子值越小,触发扩容的元素个数越少,哈希冲突概率减少,但是占用内存,增加扩容频率。

扩容因子的值的设置,是在统计学中泊松分布有关,再冲突和空间利用率之间的平衡。

1、List

1)ArrayList

底层是基于数组实现的,默认大小是10。数量达到10会进行自动扩容,创建新的数组长度为原来的1.5倍,用 Arrays.copyOf 方法旧数组数据拷贝进去,再添加新的进去。

优点:查询快,修改快;

缺点:增删慢,线程不安全。

2)LinkedList

底层是基于双向链表实现的。不存在扩容问题。

优点: 适合数据的动态插入和删除;

缺点:不适合查询、修改数据,随机访问和遍历速度较慢。线程不安全。

3)Vector

底层是基于数组实现的,支持线程同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,因此,比访问 ArrayList 慢。

2、set

1)HashSet

底层是哈希表

  • 元素是无序的
  • HashSet不是同步的,线程不安全
  • 集合元素值允许为null,但只能有一个

2)TreeSet

底层是TreeMap实现的,底层用到的数据结构是红黑树。当构造TreeSet时;若使用不带参数的构造函数,则TreeSet的使用自然比较器;若需要使用自定义的比较器,则需要使用带比较器的参数。

  • 自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。
  • 自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法。
  • 如果要按序保存条目,并且按照升序或者降序对集合进行访问和遍历,那么TreeSet就应该作为首选集合。升序方式的操作与视图性能要强于降序方式。

3)LinkedHashSet

底层是LinkedHashMap实现的,继承HashSet。

  • 元素没有重复
  • 元素有顺序
  • 可以存储null值
  • 线程不安全

3、Map

1)HashMap

底层是哈希表,无序集合,最大容量Integer.MAX_VALUE,2 的 31 次方-1。

非线程安全,可以存储null键和null值。只能有一个null键。

当get()方法返回null值时,即可以表示HashMap中没有该key,也可以表示该key所对应的value为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个key,应该用containsKey()方法来判断。

JDK1.7JDK1.8
底层entry数组+链表

node数组+链表+红黑树

(链表长度>8 && 元素数量>64)

扩容颠倒链表顺序并在元素插入前检测是否需要扩容,扩容后,元素重新计算,降低哈希冲突保持原链表的顺序并且在元素插入后检测是否需要扩容,扩容后,不会重新计算
初始容量0(第一次执行put初始)16(put时初始)
插入头插法尾插法

HashMap hashMap=new HashMap(3);

put第4个数据时,不会报错,会自动扩容的,是在容量*0.75即就是4*0.75=3,put第三次完成之后开始扩容,新容量=旧容量*2,即就是4*2=8。

为什么要右移16位异或?

主要目的是为了让hash值的散列度更高,尽可能减少哈希表的hash冲突,从而提升数据查找的性能。

再HashMap的put方法里,通过key的hash值与数组的长度取模运算得到数组的位置,大部分情况下,n取消小于2^16,也就是i的值是哈希的第十六位和n-1取模运算,造成key的散列度不高,导致key集中存储在固定的几个数组位置,影响查找性能。

右移16位,就是把hashCode高位移动到低位,再进行异或运算,降低hash冲突概率。

常见死循环问题?

只会在1.7中出现,1.7采用的是数组+链表且是头插法。

当有两个线程TA和TB,对HashMap进行扩容,都指向链表头结点NA,而TA和TB的next都是NB,假设TB休眠,TA执行扩容操作,一直到TA完成后,TB被唤醒,TB.next还是NB,但是TA执行成功已经发生了顺序改变,如下图,出现一个死循环。

解决方案:

使用ConcurrentHashMap

使用HashTable,性能低不建议

使用synchronized 或 Lock 加锁之后,再进行操作,多线程排队性能低

2)ConCurrentHashMap

底层:分段数组+链表

线程安全

key和value都不能为null

  • 通过把整个Map分为N个Segment,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保证读取到最新的值。)Segment是一个可重入锁。
  • 有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁
  • 扩容:段内扩容(段内元素超过该段对应Entry数组长度的75%触发扩容,不会对整个Map进行扩容),插入前检测需不需要扩容,有效避免无效扩容

3)LinkedHashMap

有序(插入有序,访问节点后移到最后)

非线程安全

key和value都可以为null

键重复,即被覆盖

  • 没有重写父类HashMap的put和get方法,而是对子方法addEntry、createEntry、newNode、

LinkNodeLast,实现双向链表的特点。

4)TreeMap

底层是红黑树

双列集合

键不能重复,元素有序

每次新增或删除一个kv,都可能导致红黑树的重排,因此,适用与Map元素基本不变,主要用于遍历迭代获取数据,不同的k的场景下使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/950117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端最能打的本地存储方案

产品的原话就是“要又大又全”。既然存储量大,也要覆盖全多种设备多种浏览器。 方案选择 既然要存储的数量大,得排除cookielocalStorage,虽然比cookie多,但是同样有上限(5M)左右,备选websql 使…

SPSS--s04典型相关分析

典型相关基本原理 典型相关分析是主成分分析和因子分析的进一步发展 ,是研究两组变量间的相互依赖关系 ,把两组变量之间的相互关系变为研究两个新的变量之间的相关,而且又不抛弃原来变量的信息 ,这两个新的变量分别由第一组变量和第二组变量的线性组合构成 ,并且两组变量的个数…

以太网POE供电浪涌静电防护推荐TVS二极管

POE是一种传输技术,可在以太网电缆上传输电力和数据。1000M千兆以太网POE供电端口广泛用于安防、视频监控以及智能电网等工业系统,以实现系统内的数据、视频传输、流量控制、以及通过总线实现供电。由于工业以太网工作环境非常严酷苛刻,对于以…

Java不重启服务 扩展新支付功能demo

应用场景 对于支付:经常有些需求,需要我们扩展新的支付方式,但又不希望重启服务对于IOT:经常需要新增一些解析数据的Handler 那我们如何能做到不重启服务,就能扩展新功能呢?本文给一个简单的demo示例&…

无涯教程-Android - AutoCompleteTextView函数

AutoCompleteTextView是一个类似于EditText的视图,只是它在用户键入时自动显示补充数据。 AutoCompleteTextView - 属性 以下是与AutoCompleteTextView控件相关的重要属性。您可以查看Android官方文档以获取属性的完整列表以及可以在运行时更改这些属性的相关方法。…

循环冗余校验码(CRC校验)

CRC在线计算 CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能&#xf…

会员管理系统实战开发教程06-会员充值

我们上篇讲解了会员开卡的操作,有了会员卡之后日常就是给会员进行充值,充值的逻辑是对余额进行累加,而且要记录充值的情况。 1 创建充值记录表 打开控制台,点击号创建数据源 输入数据源名称充值记录 点击编辑添加字段 先添加…

three.js(八):内置的三维几何体

三维几何体 BoxGeometry 立方体TetrahedronGeometry 四面体OctahedronGeometry 八面体DodecahedronGeometry 十二面体IcosahedronGeometry 二十面体PolyhedronGeometry 多面体SphereGeometry 球体ConeGeometry 圆锥CylinderGeometry 圆柱TorusGeometry 三维圆环TorusKnotGeomet…

部署你自己的导航站-dashy

现在每天要访问的网页都太多了,尽管chrome非常好用,有强大的标签系统。但是总觉的少了点什么。 今天我就来分享一个开源的导航网站系统 dashy。这是一个国外的大佬的开源项目 github地址如下:https://github.com/Lissy93/dashy 来简单说一下…

LabVIEW开发同步磁阻电机匝间短路故障在线诊断技术

LabVIEW开发同步磁阻电机匝间短路故障在线诊断技术 近年来,电动驾驶系统取得了实质性的改进,不仅在工业自动化和机器人技术中实施,而且在运输和风力发电中实施。自动化系统和其他执行器的典型要求包括:小尺寸、低重量、低成本、高…

【ES6】JavaScript 中的数组方法reduce

reduce() 是一个 JavaScript 中的数组方法&#xff0c;它会对数组的每个元素执行一个提供的 reducer 函数&#xff0c;将其减少到一个单一的值。 这是 reduce() 的基本用法&#xff1a; //(method) Array<number>.reduce(callbackfn: (previousValue: number, currentV…

如何在Windows / Mac / iPhone / Android / Online上将MP4转换为MP3

如果只想保留MP4视频的音频轨道&#xff0c;则可以将MP4转换为MP3格式。 MP3是几乎所有设备&#xff0c;播放器和编辑器都支持的数字音频格式。无论您将MP4视频转换为MP3音频以进行脱机播放或进一步编辑&#xff0c;都可以提取音轨并保存为MP3格式。这是在不损失质量的情况下将…

浅析Linux虚拟网络技术

文章目录 概述Tap/tun设备tun/tap的工作机制 Bridge网桥Bridge的工作机制Bridge IP 相关参考 概述 在传统的网络环境中&#xff0c;一台物理主机包含一张或多张网卡&#xff0c;要实现与其它物理主机之间的通信&#xff0c;需要将自身的网卡通过路由器或者交换机连接到外部的物…

解决gitee仓库中 .git 文件夹过大的问题

最近&#xff0c;许多项目都迁移到gitee。使用的也越来越频繁&#xff0c;但是今天突然收到一个仓库爆满的提示。让我一脸懵逼。本文将详细为你解答&#xff0c;这种情况如何处理。 1、起因 我收到的报错如下&#xff1a; remote: Powered by GITEE.COM [GNK-6.4] remote: T…

Docker - Docker安装MySql并启动

因为项目需要连接数据库&#xff0c;但是远程服务器上的mysql我不知道账户和密码&#xff0c;这个时候便是docker发挥作用的关键时刻了&#xff01; 目录 docker安装安装gcc卸载老docker&#xff08;如有&#xff09;安装软件包设置镜像仓库更新yum软件包索引安装docker启动doc…

园区能源管理系统是什么

园区能耗监测系统是可以用电力电气技术性、物联网、电子信息技术、通讯技术相当于一身&#xff0c;可以对当场里的能耗数据信息完成数据收集、存储、剖析、大屏幕呈现、分享等多种功能&#xff0c;可以为政府部门进行环保节能方式及其能源数据统计分析、预警信息、预测等&#…

04、添加 com.fasterxml.jackson.dataformat -- jackson-dataformat-xml 依赖报错

Correct the classpath of your application so that it contains a single, compatible version of com.fasterxml.jackson.dataformat.xml.XmlMapper 解决&#xff1a; 改用其他版本&#xff0c;我没写版本号&#xff0c;springboot自己默认的是 2.11.4 版本 成功启动项目…

黑马点评环境搭建导入

一开始配置maven的时候&#xff0c;发现怎么都无法查看maven的版本&#xff0c;后来才知道是JAVA_HOME的问题&#xff0c;开头多了一个空格&#xff08;因为我是直接复制过去的&#xff09;&#xff0c;然后搜网上通过命令行可以看到肉眼看不到的bug。 通过命令行的方式改正确后…

器件手册识读之 :运放

器件手册识读之 &#xff1a;运放 一、基本信息 二、引脚排列 三、最大额定参数 四、电气特性 五、应用电路 1、称重传感器放大器 2、热电偶低偏置&#xff0c;低漂移环路测量二极管冷端补偿。

网络编程 day 4

1、多进程并发服务器根据流程图重新编写 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.11…