java集合的扩容机制

2023-05-16

目录

    • ArrayList 和Vector扩容机制总结:
    • LinkedList没有扩容机制:
    • HashSet和HashMap扩容机制总结:
    • Hashtable扩容机制:
    • 小结:HashTable和HashMap区别
    • 小结:StringBuffer和StringBuilder:

总结一:以下就是List下的三个实现类集合ArrayList 和Vector,LinkedList扩容总结:

ArrayList 和Vector扩容机制总结:

ArrayList 和Vector,底层都是Object数组,默认加载因子都是1(元素满了才扩展容量).默认容量都是10;但是ArrayList 在jdk1.8时默认为空,当添加元素时,才初始化为10个容量。ArrayList:新容量为原容量的1.5倍,Vector:新容量为原容量的2倍.

ArrayList 默认初始容量为10,(jdk8的时候底层Object[] elementData数组初始化为{},并没有创建长度为10的数组。在add元素时才创建了10个容量。)
线程不安全,查询速度快
    底层数据结构是数组结构
    扩容增量:原容量的 0.5倍,新容量为原容量的1.5倍。
    如 ArrayList的容量为10,一次扩容后是容量为15

同样可以通过分析源码知道:
Vector:
默认初始容量为10,(jdk7和jdk8一样都初始容量为10)。
线程安全,但速度慢
    底层数据结构是数组结构
    加载因子为1:即当 元素个数 超过 容量长度 时,进行扩容
    扩容增量:原容量的 1倍,新容量为原容量的2倍。
    如 Vector的容量为10,一次扩容后是容量为20

LinkedList没有扩容机制:

LinkedList:没有扩容机制,因为其底层是双向链表结构。不存在数组的扩容一说,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好。

总结二:Set下的三个实现类集合HashSet和LinkedHashSet,TreeSet,扩容总结:LinkedHashSet,TreeSet没有数组的扩容机制。

HashSet和HashMap扩容机制总结:

HashSet和HashMap都是默认初始容量是16(jdk1.7的),但是jdk1.8做了优化,初始容量为0,第一次存元素的时候才扩容为16,加载因子是0.75,扩容为原来的2倍。而带LinkedHashSet和LinkedHashMap是链表不存在扩容的,HashSet:底层是数组+链表的结构

Set(集) 元素无序的、不可重复。
HashSet:线程不安全,存取速度快
     底层实现是一个HashMap(保存数据),HashSet:底层是数组+链表的结构,实现Set接口
     默认初始容量为16(jdk1.8及以后)(为何是16,见下方对HashMap的描述)
     加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
     扩容增量:原容量的 1 倍,新容量为原容量的2倍
      如 HashSet的容量为16,一次扩容后是容量为32。
      因为构造一个HashSet,其实相当于新建一个HashMap,然后取HashMap的Key。
扩容机制和HashMap一样。

Map是一个双列集合:
HashMap:jdk1.8默认初始容量0,当第一次put元素的时候才扩容为16,jdk1.7是初始化容量为16
     (为何是16:16是2^4,可以提高查询效率,另外,32=16<<1 –>至于详细的原因可另行分析,或分析源代码)
     加载因子为0.75:即当 元素个数 超过 容量长度的0.75倍 时,进行扩容
     扩容增量:原容量的 1 倍,新容量为原容量的2倍
      如 HashSet的容量为16,一次扩容后是容量为32

Hashtable扩容机制:

public Hashtable() {
        this(11, 0.75f);
    }

Hashtable默认初始容量11
二、扩容加载因子(0.75),当超出默认长度(int)(11*0.75)=8时,扩容为oldx2+1。新容量为原容量的2倍+1.
int newCapacity = (oldCapacity << 1) + 1;

      
总结:

1.HashMap如果用默认构造方法的话,HashMap开始容量为0,第一次put元素的时候才扩容为16;
2.HashMap使用有参构造方法的话,HashMap容量并不是我们参数给定的大小,而是大于等于给定容量参数的 最接近 2的次幂。如我们给定容量为7,则是2的3次幂,即8容量,因为2的次幂可以通过右移快速得到。
3.扩容为原来的2n

1HashTable如果使用默认的构造方法的话,初始容量为11;
2.HashTable如果使用有参构造方法的话,初始容量即为给定的参数容量值,如3,7等就直接用了;
3.扩容为原来的2n+1

小结:HashTable和HashMap区别

第一,继承不同。
public class Hashtable extends Dictionary implements Map
public class HashMap extends AbstractMap implements Map
第二:
Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用
Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
第三,Hashtable中,key和value都不允许出现null值。
在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,
即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中
是否存在某个键, 而应该用containsKey()方法来判断。
第四,两个遍历方式的内部实现上不同。
Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
第五,哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
第六,Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old2+1。HashMap中hash数组的默认大小是16, 增加的方式是 old2。

小结:StringBuffer和StringBuilder:

StringBuilder和StringBuffer的初始容量都是16,程序猿尽量手动设置初始值。以避免多次扩容所带来的性能问题,默认数组容量扩充为原数组容量的2倍+2

1.StringBuilder是jdk1.5引进的,而StringBuffer在1.0就有了;
2.StringBuilder和StringBuffer都是可变的字符串。能够通过append或者insert等方法改动串的内容;
3.StringBuffer是线程安全的而StringBuilder不是,因而在多线程的环境下优先使用StringBuffer,而其它情况下推荐使用
StringBuilder,由于它更快。
4.StringBuilder和StringBuffer都继承自AbstractStringBuilder类,AbStractStringBuilder主要实现了扩容、append、
insert方法。StrngBuilder和StringBuffer的相关方法都直接调用的父类。
5.StringBuilder和StringBuffer的初始容量都是16,程序猿尽量手动设置初始值。以避免多次扩容所带来的性能问题
6.StringBuilder和StringBuffer的扩容机制是这种:首先试着将当前数组容量扩充为原数组容量的2倍加上2,假设这个新容
量仍然小于预定的最小值(minimumCapacity),那么就将新容量定为(minimumCapacity),最后推断是否溢出,若溢出,
则将容量定为整型的最大值0x7fffffff。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java集合的扩容机制 的相关文章

  • Java Swing BoxLayout 忽略 AlignmentX

    在下面的代码中 通过调用setAlignmentX with Component LEFT ALIGNMENT我希望在居中的滑块上获得左对齐的标签 由于某种原因 标签也居中 似乎与传递给 setAlignmentX 的值无关 我必须向 se
  • 不支持的字段:将瞬间格式化为日期 ISO 时的年份[重复]

    这个问题在这里已经有答案了 我正在尝试将 Instant 格式化为 ldap 日期 ISO8601 但在 f format Instant now 处失败 String input 20161012235959 0Z DateTimeFor
  • 如何在ArrayList中的特定位置插入对象

    假设我有一个大小为 n 的对象的 ArrayList 现在我想在特定位置插入另一个对象 假设在索引位置 k 大于 0 且小于 n 并且我希望索引位置 k 处及其之后的其他对象向前移动一个索引位置 那么有没有什么方法可以直接在Java中做到这
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • 如何在 Android 中的 Chrome 或 Firefox 等特定浏览器的 Web 视图中加载应用程序

    我是 Android 新手 我正在做一个应用程序 我需要在平板电脑上的 Web 视图中加载现有的应用程序 在平板电脑中 当我使用 Web 视图加载应用程序时 我的应用程序将加载到默认浏览器中 如何在平板电脑上的 Web 视图中的特定浏览器
  • Selenium 和 TestNG 同时使用“dependsOn”和“priority =”问题

    我正在努力在 GUI 自动化测试中实现更好的工作流程控制 我首先从dependsOn开始 但很快发现缺点是如果一个测试失败 则套件的整个其余部分都不会运行 所以我改用 priority 但看到了意外的行为 一个例子 Test priorit
  • for循环中更新JLabel的问题

    我的程序的想法是从之前在其他 JFrame 中保存的列表中选择一个名称 我想在标签中一个接一个地打印所有名称 它们之间有很小的延迟 然后停在其中一个名称上 问题是lbl setText String 如果有多个则不起作用setText co
  • 膨胀类 android.support.design.widget.NavigationView 时出错

    我按照 NavigationView 的教程进行操作 但无法解决此错误消息 Error inflating class android support design widget NavigationView 教程链接 https www
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • 如何在 spring-data 中强制使用 CrudRepository 进行预加载?

    我有一个实体 其中包含List就是这样lazy默认加载 interface MyEntityRepository extends CrudRepository
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • Janusgraph 0.3.2 + HBase 1.4.9 - 无法设置 graph.timestamps

    我在 Docker 容器中运行 Janusgraph 0 3 2 并尝试使用运行 HBase 1 4 9 的 AWS EMR 集群作为存储后端 我可以运行 gremlin server sh 但如果我尝试保存某些内容 我会得到粘贴在下面的堆
  • 如何使用eclipse调试JSP tomcat服务?

    我想使用 Eclipse IDE 调试器来调试单独运行的 JSP Struts Tomcat Hibernate 应用程序堆栈 如何设置 java JVM 和 eclipse 以便设置断点 监视变量值并查看当前正在执行的代码 我刚刚用谷歌搜
  • 使用 Java 8 Spring 4 + MyBatis 集成问题

    使用 Java 8 1 8 0 60 Spring 4 2 1 和 MyBatis 3 3 0 时遇到以下异常 Sep 29 2015 11 02 58 AM org springframework context annotation A
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 我怎样才能限定我不“拥有”的自动装配设置器

    要点是 Spring Batch v2 测试框架具有JobLauncherTestUtils setJob与 Autowired注解 我们的测试套件有多个Job类提供者 由于这个类不是我可以修改的东西 我不确定如何限定它自动连接的作业 每个
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF

随机推荐

  • Ubuntu update-alternatives 安装/管理多版本 Python3及PIP3

    Ubuntu update alternatives 安装 管理多版本 Python3及PIP3 前言安装python安装对应版本pipupdate alternatives 切换python3 环境 前言 在ubuntu系统上 xff0c
  • 实用的Visual Studio Code插件

    1 vscode color highlight 颜色代码高亮插件 xff08 sublime text也有 xff09 2 vscode Open in Browser 右键在浏览器打开 xff08 sublime text也有 xff0
  • LWIP 双IP实现

    LwIP是Light Weight 轻型 IP协议 xff0c 有无操作系统的支持都可以运行 LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用 xff0c 它只需十几KB的RAM和40K左右的ROM就可以运行 xff
  • Seata解析-seata部署启动初体验

    本文基于seata 1 3 0版本 seata是由阿里巴巴开源的分布式事务框架 xff0c 用于在分布式环境中保持事务一致性 它提供了四种事务模式 xff1a AT TCC SAGA 和 XA 事务模式 xff0c 默认是AT模式 Seat
  • 功能案例----java实现语音播报功能

    功能案例 java实现语音播报功能 根据自己最近的写的项目 xff0c 总结整理了关于java语音播报功能的方法 xff0c 可分为两种形式 一种是通过自己写出一个语音播报方法的工具类 xff0c 然后从前端获取文本数据 xff0c 最后跳
  • spring mvc拦截器 需求:在controller层的方法上,使用自定义注解的方式 不拦截指定请求

    原来是在controller类上实现此需求 缺点 xff1a 只能是整个controller类下的方法全部放开拦截 xff0c 不能放开其中某个方法 xff0c 颗粒度太高 现实现在方法上增加注解 xff0c 更加细颗粒度 1 首先是自定义
  • 生产者消费者代码实现(JAVA)

    代码 import lombok extern slf4j Slf4j import java util LinkedList final class Message 单条消息 private int id private String m
  • 手误删除服务器tomcat下的bin目录,./start.sh无效

    关于LINUX权限 bash startup sh Permission denied 在执行 startup sh 或者 shutdown sh的时候 xff0c 爆出了Permission denied xff0c 其实很简单 xff0
  • C++ 进程间通信

    一 xff0c C 43 43 常用进程间通信 管道 Pipe xff1a 管道可用于具有亲缘关系进程间的通信 xff0c 允许一个进程和另一个与它有共同祖先的进程之间进行通信 命名管道 named pipe xff1a 命名管道克服了管道
  • 【Android7.1.2源码解析系列】Android ADB概览 ---system/core/adb/OVERVIEW.txt

    ADB实施笔记 I 总体概览 xff1a 安卓调试桥 ADB 被用来 xff1a 保持一条指向于所有安卓设备以及连接向或者运行于所给的开发主机的仿真机 实现多个适用于客户端 命令行用户或者像DDMS那样的帮助程序 的控制命令 比如说 34
  • 内存泄漏 定位方法

    目录 内存概念 物理内存 虚拟内存 内存泄漏 定位方法和手段 1 MemInFo MemTotal MemFree MemAvailable Cached 2 vmalloc info 3 Kmemleak 算法原理 使用方法 参考文献与链
  • 关于环形缓冲区的用法和理解

    通信中 xff0c 经常会遇到数据交互的问题 为了保证数据的高效处理和解析 xff0c 通常会有 缓冲区的说法 接下来谈谈常用的环形缓冲区的特点和使用方法 xff1a 说到环形缓冲区 xff0c 相信大家都不会陌生 xff0c 这里就不贴图
  • 电脑安装系统时提示“找不到硬盘”如何解决

    电脑安装系统的方法有很多众 xff0c 比较常见的是用PE来安装的 xff0c 当然也可以用U盘安装 安装过程中无法识别到硬盘那是很正常的事 xff0c 相信大部分用户都遇到过 xff0c 该如何解决 xff1f 不要担心 xff0c 本教
  • springMVC零配置之上下文配置

    记得刚参加工作的时候 xff0c 搭建springMVC框架还是需要手动配置web xml文件 xff0c 现在已经被渐渐淘汰了 xff0c 在项目中几乎看不到有这种配置了 xff0c 取而代之的是springMVC的零配置 xff0c 原
  • 记一次美团校招内推笔试经历

    2019年4月23日星期二晚上七点 这天刚好项目上生产我负责留守做远程技术支持 留下的还有个重要的原因就是今晚我有一个美团的笔试 七点笔试准时开始 信心满满打开网页地址 美团用的是赛码网来做的笔试题库 xff0c 再次之前收到了邀请码输入进
  • Android 使用 Kotlin 重写 Gradle 文件(Kotlin Gradle DSL)

    概述 众所周知 xff0c 我们在 Android Studio 是使用 Gradle 来编译的 xff0c Gradle 是一种基于 Groovy 语言的构建工具 xff0c 我们平时看到的 build gradle 中的语法结构其实就是
  • Can't open /dev/sda3 exclusively. Mounted filesystem?解决办法

    报错 root 64 hadoop101 moduels pvcreate dev sda3 Can t open dev sda3 exclusively Mounted filesystem 处理方法 umount home ext 上
  • Execution failed for task ‘:app:checkDebugDuplicateClasses‘.崩溃了崩溃了

    FAILURE Build completed with 2 failures 1 Task failed with an exception What went wrong Execution failed for task 39 app
  • @RunWith报错/SpringJUnit4ClassRunner报错或无法使用

    项目场景 xff1a 问题描述 xff1a 64 RunWith SpringJUnit4ClassRunner class 报错 第一步 xff1a 首先确保你的pom下有这两个依赖的jar包坐标 注意junit版本要4 12或者以上 我
  • java集合的扩容机制

    目录 ArrayList 和Vector扩容机制总结 xff1a LinkedList没有扩容机制 xff1a HashSet和HashMap扩容机制总结 xff1a Hashtable扩容机制 xff1a 小结 xff1a HashTab