关于String对象的初始化问题

来源:百度知道 编辑:UC知道 时间:2024/06/08 00:09:09
题目是这样的,
String a=new String("abc");
String b="abc";

System.out.println(a==b);
输出的是true还是false

我的理解是这样的,第一句话实例化了一个String对象,值是abc,关键是第二句,我从很多书上看来,直接赋值的方法,会先去内存中找看有没有一个String对象的值是abc,如果有则指向那个String对象,如果没有再new一个,那么a的值是abc,按理说b也应该指向a的地址啊,那么a,b既然指向的是同一个地址,那么a==b应该是true啊,为什么却是false呢。

谢谢!!!

String a=new String("abc"); //创建2个对象
String b="abc"; //创建一个对象

"abc"是在内存中的字符串池中,而你new String("abc")是个对象,不是存放在字符串池

再比如
String c = new String("ab");
String d = new String("ab");

System.out.println(c==d); //false

String a=new String("abc");
String b="abc";
这里的a和b是对象的引用 用==来比较的话只是比较这2个引用变量是不是相等如果是
String a=new String("abc");
b=a;
的话那 a==b的话就成立
要比较两个对象是不是相等的话需要用equals
a.equals(String b);
需要这么写

String a=new String("abc");
String b="abc";

System.out.println(a==b);
System.out.println(a.equals(b));

你可以试一试上面的代码。第一个是false,第二个是true。
关键就在于“==” 和 equals 方法,一个比较的是对象,一个比较的是引用。

“==”比较的是引用,也就是上面的a和b的的位置(他们在栈中的位置)他们在栈中的位置肯定是不同的,所以返回值是false

但是“equals”方法就不一样了,他比较的是对象,就是a和b所指向的堆中的内容,看你写的你也应该知道他们在堆中的值是一样的,都是“abc”,所以他的返回值是true。
<