关于Java中String创建的字符串对象内存分配测试问题

网友投稿 243 2022-10-09


关于Java中String创建的字符串对象内存分配测试问题

一、创建String对象的两种常用方法比较

举例说明

String str1 = "java天下第一"; //方法1

String str2 = new String("Java天下第一"); //方法2

System.out.println(str1 == str2); //比较地址,false

System.out.println(str1 == str2.intern()); //true

区别

2.1 方法1中,首先会去JVM的常量池里查找是否有存储"Java天下第一"的地址空间。如果有则直接让变量str1指向该地址空间;如果没有,则在常量池中分配一块地址空间,并将"Java天下第一"写入该空间,然后让变量str2指向该地址空间。

2.2 方法2中,JVM首先会为str2变量分配一块堆区空间,并让str2指向该空间。其次str2指向的堆区空间会维护private final char[] value,即用value指向字符串常量数据"Java天下第一"。value也需要和str1一样去查找常量池是否有"Java天下第一",步骤同str1一样。

总结:上图可以体现String创建的字符串,复用性高。

二、自定义的类,属性含有String变量

public class StringBlog {

public static void main(String[] args) {

String str1 = "Java天下第一";

ProLau pL1 = new ProLau(snTrIDltr1);

ProLau pL2 = new ProLau(str1);

System.out.println(pL1 == pL2); //false

System.out.println(str1 == pL1.name); //true

System.out.println(pL1.name == pL2.name); //true

}

}

class ProLau{

String name;

public ProLau(String name) {

this.name = name;

}

}

分析:比较结果为true表示指向同一块地址空间。

三、字符串相加比较

public static void addString(){

String str1 = "hello";

String str2 = str1 + "Java"; //底层会new一个新的String类的实例对象,让str2指向该对象

String str3 = "helloJava";

String str4 = "hello" + "Java"; //底层优化,直接拼接

System.out.println(str2 == str3); //false

System.out.println(str2 == str4); //false

System.out.println(str3 == str4); //true

System.out.println(str2.intern() == str3); //true

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:ASA 5520 内网互访实验(阿sa)
下一篇:美国联邦政府在2019财年的网络安全投入至少有150亿美元(2019年美国财政政策)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~