

一、存储结构

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


