【数据结构】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新建

String s = new String("hello");

new String("hello"),""写出来时 就已经创建存在有了 在常量池的此字面量字符数组、管理此 在常量池字符数组的 String类实例对象、在哈希表存储 连着它String引用访问信息的 链表节点 这一套对象,但new时 是一定会执行创对象的,即在堆中new出 再创出有一个String类实例对象,它同样一起指着 管理着 此常量池字面量字符数组


2.intern入池

s.intern();

s.intern(),将此字符串的字面量 从字符串哈希表出发 往字符串常量池检查 是否在常量池存在,映射到索引对应的链表 搜索完后,如果没有 此哈希值的链表节点,说明常量池中不存在 此字符串字面量,就在哈希表此位置中 创建节点 连它这个String实例对象,并将此在堆中的字符数组 移到常量池

就将此 堆中的字符数组入池 改造成了哈希表节点、String实例对象、字符串常量池字符数组 一套管理的 字符串字面量常量

评论 117
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值