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

相关推荐
番茄味城市甜菜27 分钟前
数据结构:双向链表实现,链表与顺序表的对比
数据结构·链表
東隅已逝,桑榆非晚4 小时前
红黑树:从概念到实现
数据结构·c++·笔记·学习
YSL0701245 小时前
一文通关-----树和二叉树
数据结构·算法
小糯米6015 小时前
数据结构 数组与链表 内存与缓存
数据结构
若亦_5 小时前
排序>>交换排序
java·数据结构·算法
努力努力再努力wz6 小时前
【Lua 入门系列】Lua数据结构:从 Table 出发,一文串联数组、链表、栈、队列、集合、映射与树的实现原理
数据结构·链表·lua
漂流瓶jz15 小时前
UVA-1612 猜名次 题解答案代码 算法竞赛入门经典第二版
数据结构·算法·题解·排序·aoapc·算法竞赛入门经典
A boy CDEF girl21 小时前
算法题专栏:优选算法
数据结构·算法·leetcode
图灵-M1 天前
【数据结构】静态 & 动态顺序表
c语言·数据结构·笔记
careathers1 天前
【数据结构】基于比较的排序算法 - 选择排序
数据结构·算法·排序算法