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

相关推荐
云泽8089 小时前
数据结构前篇 - 深入解析数据结构之复杂度
c语言·开发语言·数据结构
逝雪Yuki9 小时前
数据结构与算法——字典(前缀)树的实现
数据结构·c++·字典树·前缀树·左程云
技术思考者9 小时前
Leetcode - 反转字符串
数据结构·算法·leetcode
熬了夜的程序员10 小时前
【华为机试】34. 在排序数组中查找元素的第一个和最后一个位置
数据结构·算法·华为od·华为·面试·golang
草莓熊Lotso11 小时前
【数据结构初阶】--排序(一):直接插入排序,希尔排序
c语言·数据结构·经验分享·其他·排序算法
小徐不徐说12 小时前
C++ 模板与 STL 基础入门:从泛型编程到实战工具集
开发语言·数据结构·c++·qt·面试
Tisfy14 小时前
LeetCode 2411.按位或最大的最小子数组长度:一次倒序遍历
数据结构·算法·leetcode·题解·位运算·遍历
晚云与城14 小时前
【数据结构】-----排序的艺术画卷
数据结构·算法·排序算法
j_xxx404_15 小时前
数据结构:算法复杂度与空间复杂度
c语言·数据结构·算法
自由随风飘17 小时前
旅游城市数量最大化 01背包问题
数据结构·c++·算法·动态规划·旅游