黑马程序员技术交流社区

标题: 关于String类的问题 [打印本页]

作者: 毅心缘    时间: 2014-5-31 00:14
标题: 关于String类的问题
本帖最后由 毅心缘 于 2014-6-2 13:23 编辑

String a = "abc"
String a = new String("abc")
这两句有什么区别?
作者: woshihq    时间: 2014-5-31 00:53
String是一个特殊的引用类型,所以我也不是很懂
作者: 波涛    时间: 2014-5-31 01:08
String a = "abc";
String b = new String("abc");
System.out.println(a == b); //false 因为a不在堆内存中开辟空间,只在栈中直接赋值,所以他们地址不一样
System.out.println(a.equals(b));//true 因为他们各自地址指向的值是一样的

这个问题百度一下就大概知道了。
作者: luoanjade    时间: 2014-5-31 09:40
波涛 发表于 2014-5-31 01:08
String a = "abc";
String b = new String("abc");
System.out.println(a == b); //false 因为a不在堆内存 ...

我感觉你的解释有问题。
其实,String a = "abc"; 和 String b = new String("abc"); 都是创建了String对象,都是在堆内存中,只有引用变量a和b是在栈内存中。只是他们在堆内存中,分别开辟了一块内存,他们的地址是不一样的,所以a==b是false;而他们的值是一样的,所以用equals比较是true。
这个跟数组的创建有点类似,数组也有两种创建方式:
int[] i1 = new int[3]; //如果将数组的各个值赋成这样:1,2,3
int[] i2 = {1,2,3};
上面两个数组的比较:i1==i2 (false)
                              i1[0] == i2[0]  (true)
                              i1[1] == i2[1]  (true)
                              i1[2] == i2[2]  (true)
作者: 波涛    时间: 2014-5-31 10:53
luoanjade 发表于 2014-5-31 09:40
我感觉你的解释有问题。
其实,String a = "abc"; 和 String b = new String("abc"); 都是创建了String对 ...

Are you sure !?

String str = new String("abc"); 这种是用new()来新建对象的,它会存放在堆中,每调用一次就会创建
一个新的对象。
String str = "abc"; 这种是存放在栈中,创建一个String类的对象引用变量str,然后在栈中查找有没有
存放abc,如果没有,则将abc存放在栈中,并令str指向abc,如果有abc,则直接令str指向abc。
要知道在堆中开辟空间存放数据其效率是比较低的。

另外,你写的那个int [] i1 = new int[3]; 这是在堆中开辟了空间,很明显用了new关键字。但里面的基本数据类型的值依然存在了栈中。
作者: luoanjade    时间: 2014-5-31 11:29
波涛 发表于 2014-5-31 10:53
Are you sure !?

String str = new String("abc"); 这种是用new()来新建对象的,它会存放在堆中,每调 ...

可能你是对的,但是我还有一点不明,麻烦解释一下,谢谢:
                String str1 = "String" + "";
                String str2 = "String";
                String str3 = "";
                String str4 = str2+str3;
                System.out.println(str1==str4);  //false  ——> why?
                System.out.println(str1.equals(str4));  //true
作者: 波涛    时间: 2014-5-31 13:59
luoanjade 发表于 2014-5-31 11:29
可能你是对的,但是我还有一点不明,麻烦解释一下,谢谢:
                String str1 = "String" + "";
                String str ...

我在网上大概看了一下,你说的str4 = str2 + str3 这句话,是引用传递,应该是产生了一个新的对象,然后再把新创建对象的引用传给str4;
如果是值传递的话,就会相同了,如下:
String str1 = "StringA";
String str2 = "String"+"A";
str1 == str2 //true;
我没有特别深入的研究String,以上也是自己的看法。
作者: Blackay    时间: 2014-5-31 14:48
一个是在堆内存的缓冲池中 另外一个new出来的就是在堆内存的普通区中




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2