当前位置: 首页 > article >正文

JVM(HotSpot):字符串常量池(StringTable)

文章目录

  • 一、内存结构图
  • 二、案例讲解
  • 三、总结

一、内存结构图

JDK1.6
在这里插入图片描述
JDK1.8
在这里插入图片描述
我们发现,StringTable移入了Heap里面。所以,应该想到,StringTable将受到GC管理。
其实,1.6中,在方法区中的时候,也是受GC管理的。

二、案例讲解

题目

public class Demo7 {
	public static void main(String[] args) {
		String s1 = "a";
		String s2 = "b";
		String s3="a" + "b";
		String s4 = s1 + s2;
		String s5 = "ab";
		String s6 = s4.intern();

		//问提
		System.out.println(s3 == s4);
		System.out.println(s3 == s5);
		System.out.println(s3 == s6);

		String x2 = new String("c") + new String("d");
		String x1 = "cd";
		x2.intern();

		//问,如果调换了最后两行代码,如果是1.6,?
		System.out.println(x1 == x2);
	}
}

首先,我们要知道,== 号进行的比较,是比较引用的内存地址是否相同。
如果想要比较String的内容,用equals方法就可以。

字节码
在这里插入图片描述
主要看下红线处的几行代码

简单理解就是:
1、StringTable是一个HashTable结构(桶(数组)+链表
2、代码翻译

String s1 = "a";
String s2 = "b";
String s3="a" + "b";
String s4 = s1 + s2;

前三行代码可以简单的理解为,JVM启动后,会创建一个StringTable
我现在简单点把StringTable表示成StringTable[]这样
于是
上面三行代码就是
StringTable [ "a", "b" ,"ab" ]
最后一行代码是
new StringBuilder().append("a").append("b").toString() new String("ab")

intern方法
就是将字符串主动放入StringTable中,并返回StringTable中的引用地址。

1.8和1.6的区别就是
1.8不在复制对象。所以,原来的引用指向会发生改变。
而1.6是复制对象,所以,原来的引用指向不会发生变化。

三、总结

常量池中的字符串仅仅是一个符号,第一次用到时,才会变成对象。
利用串池的机制,来避免重复创建字符串对象。
字符串变量凭借的原理是StringBuilder(1.8)
字符串常量凭借的原理是编译期优化
可以用intern方法,主动将串池中没有的字符串对象放入串池中。

  • 1.8 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池, 会把串
    池中的对象引用返回
  • 1.6 将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份,
    放入串池, 会把串池中的对象引用返回

简单记忆
字符串的创建方式,如果是new的方式,就是放入堆中,而不放入串池中。
如果是""双引号方式创建,则是直接放入串池中。


http://www.kler.cn/a/326338.html

相关文章:

  • Java基础-组件及事件处理(中)
  • C++中的桥接模式
  • 【数据结构与算法】查找
  • C语言项⽬实践-贪吃蛇
  • 模糊神经网络学习方法探讨
  • 【springboot】启动原理
  • DK5V100R20ST1直插TO220F功率12V 3A同步整流芯片
  • 解决目标主机showmount -e信息泄露(CVE-1999-0554)
  • 开创远程就可以监测宠物健康新篇章
  • C++ | Leetcode C++题解之第432题全O(1)的数据结构
  • Centos 8安装VNC及多用户配置详细教程
  • java socket bio 改造为 netty nio
  • 【算法业务】基于Multi-Armed Bandits的个性化push文案自动优选算法实践
  • 电商搜索效率飞跃:阿里巴巴搜索API返回值的力量
  • 零工市场小程序如何提高找兼职的效率?
  • FFmpeg源码:avio_feof函数分析
  • 源代码保密技术的升级:模块化沙箱
  • 介绍Java中的反射并举例至少5个反射中常用的API-----Java基础相关面试题分享
  • 经典文献阅读之--WiROS(用于机器人的WiFi感知工具箱)
  • 百分点科技再获多项数据智能领域奖项
  • 骨架油封对于置放环境的要求
  • 【1分钟学会】Sass
  • SpringBoot项目请求不中断动态更新代码
  • 宝塔部署vue项目出现的各种问题
  • PostgreSQL的扩展(extensions)-常用的扩展-pgstattuple
  • Pygame中Sprite实现逃亡游戏5