【数据结构】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实例对象、字符串常量池字符数组 一套管理的 字符串字面量常量

相关推荐
CS创新实验室2 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
8Qi83 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS4 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
Boom_Shu5 小时前
长方形的关系
数据结构·c++·算法
Lsk_Smion7 小时前
力扣实训 _ [543].二叉树的直径 _ [23].合并K个升序列表
数据结构·算法·leetcode
ID_180079054739 小时前
淘宝商品详情数据接口深度解析:架构、鉴权、数据结构与实战
数据结构·架构
散峰而望10 小时前
【算法练习】算法练习精选:陶陶摘苹果(基础+升级)、Music Notes、字串变换,你能AC几道?
数据结构·c++·算法·leetcode·贪心算法·github·动态规划
凤凰院凶涛QAQ10 小时前
《Java版数据结构 & 集合类剖析》集合框架的封装设计与顺序表:“从 Iterable 到 ArrayList:集合框架的‘职业树“
java·开发语言·数据结构
8Qi810 小时前
LeetCode 148. 排序链表 —— 解法一:自顶向下递归(分治 + 归并)
数据结构·算法·leetcode·链表·递归·分治·归并
8Qi811 小时前
LeetCode 148. 排序链表 —— 解法二:自底向上归并(迭代,O(1) 空间)
数据结构·算法·leetcode·链表·归并·迭代