黑马程序员技术交流社区

标题: String两种创建对象方式的问题 [打印本页]

作者: 徐军涛    时间: 2012-11-7 16:46
标题: String两种创建对象方式的问题
public class StringDemo {
       publicstatic void main(String[] args) {
              Strings2 = new String("abc");
              Strings1 = "abc";
              Strings3 = "ab"+"c";
              System.out.println(s1.hashCode());
              System.out.println(s2.hashCode());
              System.out.println(s3.hashCode());
              System.out.println(s1==s2);
              System.out.println(s1==s3);
       }
}
--------------
运行结果:
96354
96354
96354
false
true
------------
疑问:
       s1==s2的结果为什么是false

作者: 李贺晓    时间: 2012-11-7 17:07
String s2=new String("abc")在内存中创建了两个队形,而s2中存放的是指向"abc"这个对象的地址,在这里的s2是一个引用类型
而String s1="abc"在内存中创建了一个对象,s1在这里是一个类类型变量,“abc”是对象
s1==s3这样判断的话肯定是不一样的了
你用s1.equals(s2)这样就是true了
作者: 马纵驰    时间: 2012-11-7 17:46
因为地址值不一样。 s1指向的地址是在String类的常量池中。而s2指向的地址是在内存的堆中。
作者: 任雷彬    时间: 2012-11-7 19:16
1.首先,你应该知道 ==比较的是什么  
==不仅比较对象的内容,而且比较对象的地址。
   String  s2=new String("abc");  与  String s1 = "abc";
是不相同的,String s2中包含有两个对象,String s1中只有一个对象。
String s2 = new String("abc");   先会在字符串池中寻找到对象“abc”,然后 new会
调用类中的构造函数,创建一个新的对象,而 s2会指向的是新的对象的地址值。
而String s1 = new String("abc");  直接在字符串池中寻找到字符串“abc”,s1指向字符串“abc”的地址。
所以 s1 与s2的地址不同,所以s1 == s2为false
而   “ab”+“c” = “abc”   都是字符串池中的对象 ,地址值相同,所以
            s1==s3为true
作者: 焦晨光    时间: 2012-11-7 19:46
很简单
Strings2 = new String("abc"); “abc”对象在堆中
Strings1 = "abc"; “abc”对象在常量池中

两个变量的指向不一样,当然就是false了!~
作者: xuchulong1    时间: 2012-11-7 20:52
== 要求比较高,需要两个比较的东西是完全一样的,才会返回 true(这个感觉对于java比较难以解释,new String("abc"); 这个是new了一个对象,新开辟了空间,你用 == 其实会去比较他们的地址。而"abc"是在常量区的,他们虽然东西都一样,但是本质不一样,就像你有10块钱,我有10块钱,我的钱和你的钱是相等的,这个就类似于用equals比较,但是我和你是不等的,因为我和你不一样),而 equals是比较里面的东西是不是相等。希望能帮助你去理解这个东西




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