jdk8 String 和 StringBuilder 对象创建所在位置
发布于: 2021 年 01 月 30 日
String 对象怎么存+StringBuilder 对象怎么存,代码跑起来在一琢磨,嗯,还不错!
public class Test {
public static void main(String[] args) {
System.out.println("****************String********************");
//通过new String 出来的对象在堆内存中
String str2 = new String("str")+new String("01");
//编译器会在常量池中添加一个引用指向堆内存中的字符串,并返回此添加引用
str2.intern();
//由于常量池中“str01”已经存在,所以此处没有创建新的对象,是一个引用
String str1 = "str01";
//true 由于str1变量指向的常量池中的“str01”字符串,实际上还是变量str2之前在堆内存中创建的字符串,所以结果为true
System.out.println(str2==str1);
//根据str1和str2调换一下顺序,结果变得不同。
//在堆内存创建新字符串对象
String str3 = new String("str")+new String("01");
//由于内存中已经存在“str01”,所以引用此字符串
String str4 = "str01";
//此处的intern执行,由于常量池中之前已经存在“str01”,所以变量intern是直接引用,无创建对象
String intern = str3.intern();
//false 变量str3在堆中创建了新对象,所以地址与str4(实际是str2引用的堆内存字符串对象)不同
System.out.println(str4==str3);
//true 两个引用的都是str2所指堆内存地址
System.out.println(str1==intern);
//true 两个引用的都是str2所指堆内存地址
System.out.println(str2==intern);
System.out.println("*****************StringBuilder*******************");
//此操作和string+string类似,toString操作重新创建了一个String对象
String jsj1 = new StringBuilder("str").append("01").toString();
//存入常量池 (实际还是引用str2中堆内存地址)
String intern1 = jsj1.intern();
//true 两个引用的都是str2所指堆内存地址
System.out.println(intern1 == str1);
//true 两个引用的都是str2所指堆内存地址
System.out.println(intern1 == str2);
}
}
复制代码
成长快乐!成长快乐!成长快乐!
划线
评论
复制
发布于: 2021 年 01 月 30 日阅读数: 16
版权声明: 本文为 InfoQ 作者【ilovealt】的原创文章。
原文链接:【http://xie.infoq.cn/article/397abd3b3fb8cc9009524bf24】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
ilovealt
关注
不忘初心,方得始终! 2018.05.02 加入
When you feel like giving up,remember why you held on so long in the first place.
评论