为什么trim出来的aaa与字符串aaa不双等

public static void main(String[] args) {

String a = "aaa";
String b = "12aaa";
String c = " aaa";
String d = "aaa";

System.out.println(b.substring(2, b.length()) == a);// 运行结果:false
System.out.println(c.trim() == a);// 运行结果:false
System.out.println(d == a);// 运行结果:true

}

//原因:

String是一种特殊的包装类, 可以通过俩种方式创建


String a = "aaa"
String a = new String("aaa");

第一种方式创建有以下几个步骤:
先在栈中创建一个引用变量String a;
在常量池中查找有没有存放aaa
如果存在, 直接将变量a指向aaa
如果不存在, 则在常量池中创建一个aaa, 并将变量a指向aaa
第二种方式创建有以下几个步骤:

在堆中创建一个对象aaa, 并将变量a指向堆中的aaa
在常量池中查看是否有aaa的字符串对象
如果存在, 将堆中的aaa对象与常量池中的aaa联系起来
如果不错在, 则在常量池中创建一个aaa的字符常量, 再将堆中的aaa对象与常量池中的aaa联系起来
而trim()和substring()内部都是返回的string的一个copy的对象, 即是通过new String()产生的新的对象, 地址不一样, 所以==出来是false;

注意:第二种方式的创建, 如果常量池没有aaa字符串对象, 则会一次性创建俩个对象

intern 方法可以返回该字符串在常量池中的对象的引用,可以通过下面代码简单的测试 Java代码

猜你喜欢

转载自blog.csdn.net/nuonuonuonuonuo/article/details/62887207
aaa