Java中 String str = new String("hello");的底层实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangyaa729/article/details/88641477
String str = "hello";
String str2 = new String("hello");

上面两中创建 string对象的方式底层实现的不同之处:
(1)首先,先确定String常量池的定义:
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。
Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串。
对于重复出现的字符串字面量,JVM会首先在常量池中查找,如果常量池中存在即返回该对象。
(2)str指向在常量池中的字符串"hello",在编译期就已经确定;str2指向堆上的对象,是在运行期创建,而堆中实际存放的字符串还是常量池中"hello",即value属性还是指向常量池中的字符串;

由下面的运行图即可看出,str和str2中value属性的实际地址是相同的,即最终指向的字符串的位置是相同的。
在这里插入图片描述
内存模型图入下图所示:
在这里插入图片描述
结论:String str2 = new String(“hello”);首先会在堆内存中申请一块内存存储对象内容,同时还会检查字符串常量池中是否含有"hello"字符串,若没有则添加"hello"到字符串常量池中,同时把常量池中的地址放到堆内存中;若有,则直接去常量池中的字符串内存地址即可;然后在栈中创建一个引用str2指向其堆内存块对象。(此过程中可能会创建两个对象,也可能就一个)

猜你喜欢

转载自blog.csdn.net/huangyaa729/article/details/88641477