当前位置: 首页 > article >正文

Java集合记录

一、ArrayList(数组)

1、如下代码执行,底层会初始化数组,即:Object[] elementData = {};
  • ArrayList<Stirng> list = new ArrayList<>();

2、首次添加元素时,会初始化数组elementData = new ObJect[10]; 之后再添加元素
  • list.add("AA");

3、当要添加第 11 个元素时,底层的 elementData数组已满,则需要扩容。默认扩容原来的 1.5 倍。并将原有数组中的元素复制到新的数组中
4、可以在创建是指定长度的数组

二、Vector(数组)

1、底层初始化数组,长度为10。 Object[] elementData = new Object[10];
  • Vector v = new Vector();

2、v.add(“AA”); //elementData[0] = “AA”;
3、当添加到第 11 个元素时,需要扩容,默认扩容为原来的 2 倍,但是,可以自定义扩容的长度的

三、LinkedList(双向链表)

1、底层就是简单的创建一个对象
  • LinkedList<String> list = new LinkedList<>();

2、将 “AA” 封装到一个 Node 对象1 中,list 对象的属性 first 、last 都指向此Node对象1
  • list.add("AA");

3、将 “BB” 封装到一个Node对象2 中,对象1和对象2构成一个双向链表,同时last指向此对象2
  • list.add("BB");

4、因为LinkedList使用的是双向链表,不需要考虑扩容问题

四、HashMap(jdk7

1、创建对象的过程中,底层会初始化Entry[] table = new Entry[16];
  • HashMap<String,Integer> map = new HashMap<>();

2、将 “AA” 和 78 封装到一个Entry对象中,考虑将此对象添加到table数组中
  • mapo.put("AA",78);

3、具体的添加或修改过程(重点)
  • 添加/修改的过程

  • (key1,value1)添加到当前的map中:

  • 首先需要调用key1所在类的hashCode()的方法,计算key1对应的hash值1,将此hash值1经过hash()算法之后,得到hash值2hash值2再经过indexFor()之后,就确定了(key1,value1)所在table数组中的位置索引 i

    • 1.1 如果此索引位置i的数组上没有元素,则(key1,value1)添加成功 ——> 情况1

    • 1.2 如果此索引位置i的数组上有元素(key2,value2),则需要继续比较key1key2hash值2——> 哈希冲突

      • 2.1 如果key1hash值2key2hash值2不相同,则(key1,value1)添加成功 — —> 情况2

      • 2.2如果key1hash值2key2hash值2相同,则需要继续比较key1key2equals()。要调用key1所在类的equals()key2作参数传递

        • 3.1 调用equals(),返回 false :则(key1,value1)添加成功 — —> 情况3

        • 3.1 调用equals(),返回 true:则认为key1key2相同。默认情况下,value1被替换为value2

说明:情况1:将(key1,value1)存放到数组索引 i 的位置
情况2,情况3:(key1,value1)和(key2,value2)构成单项链表结构,(key1,value1)指向(key2,value2)(头插法)
随着不断添加元素,在满足如下的条件下会考虑扩容:
(size >= thewshold) && (null != table[i])
当元素的个数达到临界值(= 数组的长度 * 加载因子(0.75))时,就会考虑扩容,默认扩容为原来的 2 倍

http://www.kler.cn/a/288056.html

相关文章:

  • (附项目源码)nodejs开发语言,212 个性化音乐推荐系统的设计与实现,计算机毕设程序开发+文案(LW+PPT)
  • 机器学习day5-随机森林和线性代数1
  • PCA 原理推导
  • 24.11.13 机器学习 特征降维(主成份分析) KNN算法 交叉验证(K-Fold) 超参数搜索
  • Postman接口测试(断言、关联、参数化、输出测试报告)
  • 林曦词典|养生
  • 苍穹初始-云与应用设计
  • 关于STC-ISP软件选项“下次下载用户程序时擦除用户EEPROM区”的质疑
  • 【CanMV K230】画图,画它个多啦A梦
  • 仿人机器人
  • 单片机-STM32 时钟(六)
  • 73.给定一个 m x n 的矩阵,实现一个算法如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法
  • Python多种列表操作方法
  • Django Admin在列表视图页面上显示计算字段
  • godot开发初体验
  • 黑马JavaWeb开发笔记13——Springboot入门(创建、运行测试项目)、Http协议(请求响应协议)、HTTP协议解析
  • 问:关于内部类,知道这些就够了~
  • C++初学(18)
  • Vue学习笔记 二
  • 【赵渝强老师】MongoDB的WiredTiger存储引擎
  • C#Math计算的几个常用方法
  • Pandas 1- 创建文件
  • 关键点检测(6)——yolov8-neck的搭建
  • 微信小程序背景图无法显示
  • 2409d,d语言非常简单利用sqlite3库
  • 前端宝典二十六:vue3的新特性