目录
这是String类的详解:String类变量
一、存储结构

1.字符串常量池
字符串常量池,++配合着字符串哈希表++ ,存储所有""引起来的 ++字符串字面量++
2.字符串哈希表
2.1结构
字符串哈希表采用的是 HashMap的存储结构,采用开散列 处理哈希冲突
2.2基础存储单位
哈希数组里的 基础存储单位是链表的节点,每个节点里存储 键对象 、值对象 、冲突情况 下一个节点引用 ,++每个链表节点 已包含了Map的包装节点++:
2.2.1键对象
键对象是 字符串字面量产生的 哈希值,哈希值通过++哈希函数++ 得到其在哈希数组中的存储++索引++ 去存储 ,++不同字符字面量产生的哈希值 肯定是不同的,但是通过哈希函数计算转化得到的索引 可能相同而发生哈希冲突++ ,所以用**++链表++将它们连起来 存同一个索引**里面
2.2.2值对象
值对象是 管理此字符串的 String类实例对象的引用
二、存储过程
1.搜索
任何一个**""字符串字面量 写出来存在** 时,都会前往字符串哈希表 ,根据其字符串字面量 产生哈希值 ,经过哈希函数 计算,得到索引 位置,往数组索引位置里面的 链表去搜索
根据每一个节点里面存储的 键值哈希值 判断是否有 此字面量常量内容的节点
- 如果搜索到已有此节点,就把它的值对象 管理此字面量的String实例对象引用 返回
2.创建
- 如果搜索完发现 并没有此哈希值的节点,说明常量池中 还没有创建存储有 此字符串字面量常量,于是将 此字符串字面量及它的一套存储管理结构 创建出来:
- 将此字面量内容的字符数组 在常量池里创上,
- 将管理它的String类实例对象创出:value填上此数组引用 能管理着此字面量字符数组、hash里填上 此字符串字面量的哈希值
- 将存储在哈希表上连着的 链表节点创出:键对象 存此字面量哈希值 、值对象 存此String类实例对象引用 访问着连上、next为null
- 最后将此链表节点 连上此哈希表里
于是就搭建好了 从哈希表 链表节点 到字符串常量池 字面量字符数组 的访问管理路径结构
三、存储位置
- 字符串常量池 、字符串哈希表 都存储在堆区
- 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实例对象、字符串常量池字符数组 一套管理的 字符串字面量常量