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

【数据结构】String字符串的存储

目录

一、存储结构

1.字符串常量池

2.字符串哈希表

2.1结构

2.2基础存储单位

2.2.1键对象

2.2.2值对象

二、存储过程

1.搜索

2.创建

三、存储位置

四、存储操作

1.new新建

2.intern入池


这是String类的详解:String类变量

一、存储结构

1.字符串常量池

字符串常量池,配合着字符串哈希表存储所有""引起来的 字符串字面量


2.字符串哈希表

2.1结构

字符串哈希表采用的是 HashMap的存储结构,采用开散列 处理哈希冲突


2.2基础存储单位

哈希数组里的 基础存储单位是链表的节点,每个节点里存储 键对象值对象冲突情况 下一个节点引用每个链表节点 已包含了Map的包装节点

2.2.1键对象

键对象是 字符串字面量产生的 哈希值,哈希值通过哈希函数 得到其在哈希数组中的存储索引 去存储不同字符字面量产生的哈希值 肯定是不同的,但是通过哈希函数计算转化得到的索引 可能相同而发生哈希冲突,所以用链表将它们连起来 存同一个索引里面

2.2.2值对象

值对象是 管理此字符串的 String类实例对象的引用


二、存储过程

1.搜索

任何一个""字符串字面量 写出来存在时,都会前往字符串哈希表,根据其字符串字面量 产生哈希值,经过哈希函数计算,得到索引位置,往数组索引位置里面的 链表去搜索

根据每一个节点里面存储的 键值哈希值 判断是否有 此字面量常量内容的节点

  • 如果搜索到已有此节点,就把它的值对象 管理此字面量的String实例对象引用 返回

2.创建

  • 如果搜索完发现 并没有此哈希值的节点,说明常量池中 还没有创建存储有 此字符串字面量常量,于是将 此字符串字面量及它的一套存储管理结构 创建出来
  1. 将此字面量内容的字符数组常量池里创上,
  2. 将管理它的String类实例对象创出:value填上此数组引用 能管理着此字面量字符数组、hash里填上 此字符串字面量的哈希值
  3. 将存储在哈希表上连着的 链表节点创出:键对象 存此字面量哈希值值对象 存此String类实例对象引用 访问着连上、next为null
  4. 最后将此链表节点 连上此哈希表里

于是就搭建好了 哈希表 链表节点 到字符串常量池 字面量字符数组 的访问管理路径结构


三、存储位置

  • 字符串常量池字符串哈希表都存储在堆区
  • char[] ChArray = new char[]{'a','b','c'},创建出的字符数组 存储在 堆区中字符串常量池外的部分
  • new String(ChArray)时,会把此 在外部分堆区的字符数组 拷贝再创一份 在外堆 指着管理它

四、存储操作

1.new新建

String s = new String("hello");

new String("hello"),""写出来时 就已经创建存在有了 在常量池的此字面量字符数组、管理此 在常量池字符数组的 String类实例对象、在哈希表存储 连着它String引用访问信息的 链表节点 这一套对象,但new时 是一定会执行创对象的,即在堆中new出 再创出有一个String类实例对象,它同样一起指着 管理着 此常量池字面量字符数组


2.intern入池

s.intern();

s.intern(),将此字符串的字面量 从字符串哈希表出发 往字符串常量池检查 是否在常量池存在,映射到索引对应的链表 搜索完后,如果没有 此哈希值的链表节点,说明常量池中不存在 此字符串字面量,就在哈希表此位置中 创建节点 连它这个String实例对象,并将此在堆中的字符数组 移到常量池

就将此 堆中的字符数组入池 改造成了哈希表节点、String实例对象、字符串常量池字符数组 一套管理的 字符串字面量常量

http://www.xdnf.cn/news/3477.html

相关文章:

  • 当MCP撞进云宇宙:多芯片封装如何重构云计算的“芯“未来?
  • 循环插入数据库行
  • LEETERS题解
  • 【速写】prune与activate
  • 尝试leaflet+webassemly
  • 【Python-Day 8】从入门到精通:Python 条件判断 if-elif-else 语句全解析
  • day09-面向对象综合训练
  • 实验三 软件黑盒测试
  • 【记录】台式机安装GTX1660驱动过程
  • 【RocketMQ 生产者消费者】- 同步、异步、单向发送消费消息
  • 学习与规划的融合Dyna-Q:python从零实现
  • BOFZ 緩衝區溢出shell脚本檢測工具
  • XGBoost算法详解:原理、实现与调优指南
  • py使用uniad原生sdk 3, 放弃Buildozer,使用BeeWare
  • 字符串转换整数(atoi)(8)
  • c++题目_P1027 [NOIP 2001 提高组] Car 的旅行路线
  • 征服大海的人
  • 算法题题型总结
  • Python学习笔记(第二部分)
  • ​​​​​​​2025年第二十二届五一数学建模竞赛题目A题 支路车流量推测问题
  • 用Python代码绘制跳动的梦幻爱心,感受编程的浪漫与奇妙
  • CHAPTER 12 Special Methods for Sequences
  • stm32数码管显示数字/循环
  • 2025五一杯数学建模C题:社交媒体平台用户分析问题,完整第一问模型与求解+代码
  • ‌AI与编程的范式革命:从工具到协作者的进化之路
  • 等保系列(一):网络安全等级保护介绍
  • OWASP TOP 10 2025
  • 第 11 届蓝桥杯 C++ 青少组中 / 高级组省赛 2020 年真题(选择题)
  • 408考研逐题详解:2009年第6题
  • PyTorch入门------训练图像分类器