【数据结构】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新建

java 复制代码
String s = new String("hello");

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


2.intern入池

java 复制代码
s.intern();

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

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

相关推荐
Frostnova丶7 小时前
(15)LeetCode 189. 轮转数组
数据结构·算法·leetcode
来一碗刘肉面8 小时前
顺序表的按值查找
数据结构·c++·算法
小肝一下9 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
j7~9 小时前
【数据结构初阶】带头双向循环链表 (DSList) --增删查改完整实现详解
c语言·数据结构·链表·带头双向循环链表
石像鬼₧魂石10 小时前
贵州商会管理系统 —— 商协会数字化运营一站式平台
大数据·数据结构·物联网·eclipse·数据库架构
Java面试题总结10 小时前
区间树:反向映射的前置数据结构
java·前端·数据结构
想做小南娘,发现自己是女生喵20 小时前
【无标题】
数据结构·算法
凤凰院凶涛QAQ1 天前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
郝学胜-神的一滴1 天前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe1 天前
算法滑动窗口
数据结构·算法