1、Stringaabc;首先在栈中定义了一个引用变量a检查字符串常量池中是否已经存在abc如果存在直接将a指向这个地址注意 1、String a "abc"; 首先在栈中定义了一个引用变量a检查字符串常量池中
1、String a "abc";
首先在栈中定义了一个引用变量a检查字符串常量池中是否已经存在"abc"如果存在直接将a指向这个地址注意指向的是字符串常量池中的地址
如果字符串常量池中不存在"abc"则进行如下操作1、在栈中创建三个char型的值a,b,c然后在堆中new一个String对象它的值是刚才在栈中创建的三个char型值组成的数组{a,b,c}接着这个String对象会被存放进字符串常量池中最后将a指向这个对象在字符串常量池中的地址。
String a "abc";
等效于
char data[] {a, b, c};
String a new String(data);
2、String a new String("abc");
首先在栈中定义了一个引用变量a然后在堆中new一个String对象a指向这个对象然后new出来的String对象再指向常量池中的abc。
3、比较
String a "abc";
String b "abc";
String c new String("abc");
String d new String("abc");
System.out.println(ab);
System.out.println(ac);
System.out.println(c d);
执行结果
true
false
false
注意new String("abc") 无论字符串常量池中是否存在“abc”都会在堆中生成一个新的对象所以a、c、d三者不相等。
以上为个人理解如果有误欢迎指正。