对于String str = “test” 的分析
首先会检查字符串池中是否存在"test" 字符串,如果没有则会创建一个"test"
字符串放进字符串池中,并且会让str指向"test"。 如果已经存在"test"字符串,
则,后面创建的字符串对象会指向同一个"test",使得两个字符串地址相同。
String str1 = "test";
String str2 = "test";
System.out.println(str1 == str2); //true
对于String str = new String(“test”)的分析
使用new 创建字符串时,仍然会首先检查字符串常量池中是否有相同的字符串,如果
有就会拷贝一份放到堆中,然后返回堆中的地址; 如果常量池中没有则会在堆中创建
一份,返回堆的地址。
String str1 = new String("test");
String str2 = new String("test");
System.out.println(str1 == str2); //false
//这里要知道用构造器创建的对象,是不会被放入常理池中的,而是会再堆区中
//开辟一块空间进行存储,两对象地址不相同,所以结果为false
两种创建方式结果的对比
String str1 = "test";
String str2 = new String("test");
System.out.println(str1 == str2); //false
//通过分析很明显这两对象的地址不是同一个
注: 对于使用new 创建字符串可以说 无论常量池中是否存在与要创建的字符串相同的字符串,都会在堆空间中创建一份,这是一种浪费空间的操作,在开发中并不是最佳的选择。
来源:CSDN
作者:qq_449094588
链接:https://blog.csdn.net/qq_42311614/article/details/104522510