A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 毅心缘 中级黑马   /  2014-5-31 00:14  /  1500 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 毅心缘 于 2014-6-2 13:23 编辑

String a = "abc"
String a = new String("abc")
这两句有什么区别?

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 多用论坛搜索和百度搜索哦。继续加油。.

查看全部评分

7 个回复

倒序浏览
String是一个特殊的引用类型,所以我也不是很懂
回复 使用道具 举报
String a = "abc";
String b = new String("abc");
System.out.println(a == b); //false 因为a不在堆内存中开辟空间,只在栈中直接赋值,所以他们地址不一样
System.out.println(a.equals(b));//true 因为他们各自地址指向的值是一样的

这个问题百度一下就大概知道了。
回复 使用道具 举报
波涛 发表于 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)
回复 使用道具 举报 1 0
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关键字。但里面的基本数据类型的值依然存在了栈中。
回复 使用道具 举报
波涛 发表于 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:38
7#
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,以上也是自己的看法。
回复 使用道具 举报
一个是在堆内存的缓冲池中 另外一个new出来的就是在堆内存的普通区中
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马