写点什么

jdk8 String 和 StringBuilder 对象创建所在位置

用户头像
ilovealt
关注
发布于: 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
用户头像

ilovealt

关注

不忘初心,方得始终! 2018.05.02 加入

When you feel like giving up,remember why you held on so long in the first place.

评论

发布
暂无评论
jdk8 String和StringBuilder对象创建所在位置