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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王渠 中级黑马   /  2012-6-4 10:29  /  1990 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

创建一个字符串"Welcome to Java"有下面的方法
  1. String s = "Welcome to Java";
复制代码
或者
  1. String s = new String("Welcome to Java")
复制代码
哪一个更好呢?为什么呢?知道在equals两者的时候得到的答案是false,但是还是不知道,在实际中究竟用哪一种是比较好一点。

6 个回复

倒序浏览
String s = "Welcome to Java";  只创建了一个对象
String s = new String("Welcome to Java");  创建了2个对象
开发通常第一个  方便。
另外 它们的 equals比较 是true  == 比较才是false
回复 使用道具 举报
黄克帅 发表于 2012-6-4 10:37
String s = "Welcome to Java";  只创建了一个对象
String s = new String("Welcome to Java");  创建了2个 ...

嗯,的确应该是 == 时才是false,你的意思是因为创建了两个对象而多占用了空间,所以常用第一个吗?
回复 使用道具 举报
本帖最后由 何拴绪 于 2012-6-4 10:57 编辑

第一种方式相对比较高效,节省内存。和Java中的基本数据类型一样,经常使用,这些变量都存在在栈中,访问高效。引用类型内存分配在栈和堆中的。所以比较占据内存。
== 和equals方法的区别论坛里讨论的很多了。
==比较的是对象的首地址,equals方法是从Object类继承来的,也是比较的对象的首地址。
但是String类重写了equals方法,比较的是对象的字符串。在集合类中用到某些方法时,都要重写equals方法,而且必须重写hashCode方法。相同的对象都具有相同的哈希值。
回复 使用道具 举报
object中的equals和==号是一样的,比较的是地址值,但是String复写了equals比较的是里面的内容,所以返回true
回复 使用道具 举报
本帖最后由 金鑫 于 2012-6-4 10:58 编辑

第一句String s = "Welcome to Java";创建的对象在常量池中,内容是Welcome to Java
第二句String s = new String("Welcome to Java");new是在内存中开辟了一个独立的内存空间,用来存储对象,对象的内容也是Welcome to Java

equals()方法比较的是对象的内容,所以记过是true; 而==比较的是对象在内存中的地址,所以结果是false,因为他们虽然内容相同,但是在内存中的地址是不同的。
同上:
String s1= new String("Welcome to Java");
String s2 = new String("Welcome to Java");
这2个对象s1==s2也是false,因为每一次new都是开辟一个独立的空间
回复 使用道具 举报
本帖最后由 张文强 于 2012-6-4 11:10 编辑

这个经常在面试中问到
1、前者在栈内存中、后者在堆内存中,而栈的存取速度比堆要快
2、使用String s = "Welcome to Java";的方式,可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。
     而对于String s = new String("Welcome to Java")的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

从这两个方面讲 第一种方式更好些
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马