首页 > 编程语言 >Java 基础 -集合类

Java 基础 -集合类

时间:2024-11-18 17:42:19浏览次数:1  
标签:扩容 Java HashMap 树化 int ArrayList 基础 集合 节点

集合类

Java 中重要的集合类有以下这些:集合类:Hashtable、HashMap、ArrayList、LinkedList、TreeMap、WeakHashMap

1、ArrayList

ArrayList 是一个有序数组,内部使用对象数组进行存储,并且有一个单独的 size 字段存储数组中对象的数量。

transient Object[] elementData;
private int size;

提示:虽然 elementData 是用 transient 进行修饰的,但是 ArrayList 提供了 writeObject/readObject 方法用于序列化时候读写用。

1.1 ArrayList.add() 方法流程图

ArrayList 内部的数据数组只有在第一次写入时才会进行初始化,使用 new ArrayList() 时候并没有初始化,是一个懒加载的模式。

可以看出,ArrayList 每次添加对象,基本上都要进行扩容,效率比较低

2、LinkedList

LinkedList 是一个链表类,内部是使用的双指针节点进行的实现,有头指针个尾部指针,还有一个 size 变量存储链表中元素的数量

transient int size = 0;
transient Node<E> first;
transient Node<E> last;

3、TreeMap

TreeMap 是一个树形 Map 类,内部使用了红黑树结构进行存储,由指针节点组成

包含,左子树指针,右子树指针,父节点指针

TreeMap(红黑树)的查找、插入、删除操作时间负责度都为:O(logn)

private transient Entry<K,V> root;

static final class Entry<K,V> implements Map.Entry<K,V> {
    K key;
    V value;
    Entry<K,V> left;
    Entry<K,V> right;
    Entry<K,V> parent;
    boolean color = BLACK;
}

查找、插入、删除操作均为基础的红黑树逻辑操作(需要参考数据结构与算法,然后去阅读)

4、HashMap

HashMap 是一个哈希键值对集合,内部使用了节点数组进行存储。

4.1 核心参数

核心变量如下

  • Node<K,V>[] table:节点数组,存储键值对数据
  • int size:键值对数量
  • int modCount:修改计数器,每次 HashMap 修改操作,计数器都会 +1
  • int threshold:扩容临界点,用于触发扩容的阈值,threshold = 容量 * loadFactor,当 size > threshold 时候,将触发 HashMap 的扩容操作
  • final float loadFactor:负载因子,只有初始化的时候可以指定,默认值为 0.75,用于计算扩容临界点值

核心常量如下

  • int DEFAULT_INITIAL_CAPACITY = 1 << 4:默认 HashMap 容量大小,如果初始化时不指定容量,即为 16
  • int MAXIMUM_CAPACITY = 1 << 30:最大容量,230
  • float DEFAULT_LOAD_FACTOR = 0.75f:默认负载因子为 0.75

节点树化使用常量如下:

  • int TREEIFY_THRESHOLD = 8:节点树化临界点,当节点长度 > TREEIFY_THRESHOLD,进入节点树化逻辑
  • int UNTREEIFY_THRESHOLD = 6:节点取消树化临界点,当扩容时,节点长度 < UNTREEIFY_THRESHOLD,节点取消树化
  • int MIN_TREEIFY_CAPACITY = 64:节点树化最小容量临界点,在树化逻辑中,当 size < MIN_TREEIFY_CAPACITY 时候,不进行树化操作,而是直接对 HashMap 进行扩容操作,所以一个节点是否树化有两个核心判断条件

了解以上核心参数的概念后,其实已经可以推断出 HashMap 的操作逻辑了。

使用 new HashMap() 初始化的时候并不会去初始化 table,只有当有写入操作的时候才回去进行初始化。

4.2 基础方法

static final int tableSizeFor(int cap):对于给定的容量 cap,计算出大于 cap 的最小的 2 的 N 次幂,作为下一次扩容使用的临界点参数值,也就是扩容后的数组的大小,这个方法可以看出,HashMap 数组只能以 2 的倍数进行扩容,每次扩容为原来的 2 倍。

4.3 HashMap.put() 方法流程图

4.4 HashMap 扩容逻辑

5、Hashtable

Hastable 是线程安全的哈希表,负载因子与扩容临界值与 HashMap 用法一致

Hashtabe 是数组 + 链表的结构,没有使用红黑树

插入元素时候,如果发生哈希冲突,则会插入链表的头结点 

6、WeakHashMap

WeakHashMap 是由数组 + 链表构成,表中每个节点都是弱引用节点,当被垃圾回收器扫描到后,元素将会被回收处理。

引用强度:强引用(正常对象)> 软引用 > 弱引用 > 虚引用

 

标签:扩容,Java,HashMap,树化,int,ArrayList,基础,集合,节点
From: https://www.cnblogs.com/baokang/p/18552415

相关文章

  • 一文二十分钟搞懂云技术基础
    目录一、引言二、云架构介绍1.技术基础的必要性2.历史演变3.云计算的定义4.公有云与私有云5.共享责任模型三、云服务核心特点四、云分类云服务模型部署模型五、云架构云架构概述1.核心组件2.设计原则3.架构模式4.部署模型5.管理工具6.持续集成......
  • 常用代码模板1——基础算法
    算法基础课相关代码模板活动链接——算法基础课快速排序算法模板——模板题luogu785.快速排序voidquick_sort(intq[],intl,intr){if(l>=r)return;inti=l-1,j=r+1,x=q[l+r>>1];while(i<j){doi++;wh......
  • rust学习九.2、集合之字符
    按照作者的意思,字符不是看起来那么简单!的确,字符在大部分语言中,都不是看起来那么简单!字符的内容看起来很多,又很少!多是因为涉及到编码、构成、方法(有许多方法)还有字符切片。少是因为,其实和java等语言其实没有大的区别。一、构成rust的字符内部是vec(u8)+方法,看起来和java其实......
  • Spring基础——针对实习面试
    目录Spring基础什么是Spring框架?列举一些重要的Spring模块SpringCore核心模块SpringAOP模块SpringMVC模块SpringData模块SpringSecurity模块SpringBoot模块Spring,SpringMVC,SpringBoot之间什么关系(区别)?Spring框架SpringMVCSpringBootSpring基础什......
  • 【MySQL】库的基础操作入门指南
    ......
  • markdowm基础使用教程
    Markdown标题语法要创建标题,在单词或短语前面添加井号(#),几级标题就用几个#。Markdown强调语法粗体(Bold)要加粗文本,在单词或短语的前后各添加两个星号(**)A斜体(Italic)要用斜体显示文本,在单词或短语前后添加一个星号(*)A粗体(Bold)和斜体(Italic)要同时用粗体和斜体突出显......
  • 人工智能之机器学习线代基础——齐次和非齐次
    齐次(Homogeneous)和非齐次(Non-Homogeneous)是描述线性方程组或线性系统的一种分类。它们的主要区别在于方程组的常数项是否为零。    这里的x1是未知数之一。我们没有直接求x1​的具体值,而是通过表达式间接表示它。这是因为线性方程组中有自由变量(x2 和x3),所以我......
  • 程序化交易系统如何获取MACDKDJBOLL等基础指标值?
    Python股票接口实现查询账户,提交订单,自动交易(1)Python股票程序交易接口查账,提交订单,自动交易(2)股票量化,Python炒股,CSDN交流社区>>>基础指标如MACD、KDJ、BOLL等在交易中非常关键。MACD能显示股价趋势的强弱,通过DIF线与DEA线的交叉等情况,投资者可判断股票买卖时机。KDJ指......
  • iman——冲刺集合
    日志名称链接日期当天完成的工作量剩余的工作量已完成工作量占总工作量的百分比iman——冲刺日志(第一天)点击查看11月11日16%84%16%iman——冲刺日志(第二天)点击查看11月12日16%68%32%iman——冲刺日志(第三天)点击查看11月13日18%50%50%iman—......
  • 【老白学 Java】休闲时刻 - 打造 CMD 战舰(三)
    休闲时刻-打造CMD战舰(三)文章来源:《HeadFirstJava》修炼感悟。上一篇,老白通过「硬编码」对战舰类的功能模块进行了简单测试。本篇的主要任务是继续完善战舰类并反复测试,其中涉及到几个新技术,师兄们如果感兴趣,请接着往下看。项目进度:列出必要的程序清单简单描......