1.String a = "123";
String a = "123",
String b ="123";
栈中存贮对象的引用(保存着对象的地址值),字符串常量储存在方法区中。
方法区中不含相同的值,因此以此种方式定义的时候a与b中存放的地址值相同。
因此结果为true;
2.String a= new String(“123”);
String a = new String("123");
String b = new String("123");
用“new+构造器”这种方式创建String对象new一次就在堆空间中开辟一个空间。
用这种方法创建对象在内存中会创建两个对象:一是堆空间中new结构,二是对应的常量池中的数据。
在内存中的图示:
此时a与b储存的是堆中的地址,因此即使他们在方法区的值相同,他们的地址值也是不同的。
所以结果为false;
3.两种定义不同的方式
String a ="123";
String b = new String("123")
b用new定义则字符串对象存放在堆中,因此此时b中储存的是堆空间的地址值。
a是栈中存贮对象的引用(保存着对象的地址值)
所以结果为false;