public class test {
public static void main(String[] args) {
String a=new String("123");
String b=new String("123");

String c="123";
String d="123";

System.out.println(a==b); //false
System.out.println(a.equals(b)); //true

System.out.println(c==d); //true
System.out.println(c.equals(d)); //true
}
}这两种定义变量有什么区别呢?为什么第一个是false,后面的两个是true。

解决方案 »

  1.   

    不要用 == 判断两个String是否相等。
    a, b 是两个不同的引用
      

  2.   

    因为new是创建了一个String的实例,也就是对象~==是用来判断对象在不在同一块内存的,equals则是判断字符是否相等。而下面的String c=“....”; 没有创建对象,是对一个变量赋值罢了
      

  3.   

    String作为引用数据类型,会在栈生成一个对应的堆地址,实际数据保存在堆里面地址肯定不能一样啊,所以是false想int这种,数据直接保存在栈里面,一比较,就知道了==是比较栈里面的东西的新手,不对请指教
      

  4.   

    建议楼主看一下JavaSE的官方文档,String详解
    String s = “aaa”与 String s = new String(“aaa”);区别:
    前者是在String Pool中检查是否有aaa这个对象,如果有,则在地址池中把地址返回给s这个引用,如果没有,则在地址池中生成aaa这个对象,同时把地址返回给s这个引用。
    后者是判断在String Pool中检查是否有aaa这个对象,如果有,就直接在heap堆中生成一个“aaa”的对象,然后把地址返回给s这个引用,如果没有,首先在String Pool中生成创建一个“aaa”对象,然后再堆heap中再创建这个aaa对象,把地址返回来,赋给s这个引用。
    String a=new String("123");
    String b=new String("123");
    结果为false,因为a和b指向堆中的对象不同,尽管他们在String Pool 字符串池中的对象是一样的。String c="123";
    String d="123";
    结果为true,因为执行String c = "123"时候,在字符串池中生成了“123”这个对象,第二语句String d="123";由于检查String Pool中存有“123”这个对象了,所以直接把地址返回赋个d,这样c和d就具有相同的地址了,所以他返回true注意String Pool是在内存的栈中,new一个对象的话是在 heap堆中生成对象的。
      

  5.   

    去看这篇帖子中我的回复,应该对你理解这个有帮助
    http://bbs.csdn.net/topics/390290120
      

  6.   

    不好意思,刚刚发错连接了是这个:http://bbs.csdn.net/topics/380044859
      

  7.   

    http://bbs.csdn.net/topics/390085548
      

  8.   

    对于string来说=是地址比较,equals是值比较
      

  9.   


    String类型的比较最好是用equals比较,很多时候用==会报错。
      

  10.   

    ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
    如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
    equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
    String a=new String("123");
    String b=new String("123");
    两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
      

  11.   

    == 比较的是内存地址,equals是比较的值
      

  12.   

    这个问题不只是String有,像Integer什么的都有,我还是想不明白new和不new之间的区别。按照4楼那么说的话,难道改c的值,d也跟着改?
      

  13.   

    有一种东西叫地址,==就是地址,equals是针对值的
      

  14.   

    String a = new String("123");
    String b = new String("123"); String c = "123";
    String d = "123"; System.out.println(a == b); // false  
    //a VS b 不相等是因为new的时候,在堆中都会创建对应的对象,它们的引用都指向独自的对象,a VS b也就是对象地址值,当然不相等。
    System.out.println(a.equals(b)); // true
    // 你可以查看源代码,String类重写了 Object 类的equals()方法,也就是说如果它们的字符串的值相等就会返回true。
    System.out.println(c == d); // true
    //当创建c时,会在常量池中检查有没有"abc"的字符串字面量,因为没有则创建,同理创建d时,因为已经有了,所以不再创建,所以 c 和 d 都指向同一个对象.
    System.out.println(c.equals(d)); // true
    //只要是 字符串字面量相等,equals方法就会return true.说的很清楚了哦。
      

  15.   

    再建议你可以看下Java文档的
    String.intern()
    的说明,也有点意思。
      

  16.   

    java是面向对象的,==比较的是值,equals比较的是对象
    两个不同的对象拥有相同的值 这时==为true,equals为false
    两个不同的对象拥有不同的只 这时==为false,equals为false
    两个相同的对象不可能拥有不同的值 所以这时==为true,equals为true
      

  17.   

    说反了==是比较对象,equals是比较值
      

  18.   

    找本经典java书,多看几遍就理解了。
      

  19.   

    各位赞同这位吗,下面给出的链接说法不同噢,new到底会不会去检查常量池呢
      

  20.   

    呵呵,a和b地址不同,c和d地址相同,那么c和d的地址究竟是a的地址还是b的地址,还是不确定,这个值得测试一下。
      

  21.   

    java中,在比较字符串的相等与否时,可以用==和equals()方法。
    当字符串不是通过new String();得到的话,可以用 == 比较,也可以用equals()方法比较。
    当字符串是通过new String();得到的话,一定要用equals()方法。总结:
    ==       是用来比较地址或者引用;
    equals() 是用来比较字符串的值或引用。                希望对你有帮助!
      

  22.   

    Stirng a=new String("123");
    String b=new String("123");
    分别创建了两个对象 a 和 bString c="123";
    String d="123";
    为两个指针指向了虚拟机堆中的同一个对象。==比较的是对象在堆中的地址,所以a 和 b 的地址不同,而c 和 d 的地址相同。在看看String的equals方法 先比较地址,如果地址不等再比较对象的相同位置的字符。
    public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
    return false;
    }
    return true;
        }
    }
    return false;
        }
      

  23.   

    字符串常量在内存中共享! 对象每次new 出一个就分配新的空间。 == 可以视为判断是否指向同一块内存。equals 一般是判断两个对象是否遵循自己制定的规则,在String 就是判断这个String 里的字符是否相等!
      

  24.   

    java中除了8种基本数据类型外,其他的都是对象。对象比较用equals
      

  25.   

    “==”比较地址值,“equals”比较对象内容,还有每次用new创建都会创建一个String对象,而String a=“abc”这种形式会去字符串池中查找“abc”,找不到才会创建一个“abc”
      

  26.   

    String类重写了 Object的equals方法,是String的特有方法。这个方法在字符串里就是判断两个字符串是否相同String a=new String("123");
    String b=new String("123");
     虽然在内存中有两个对象,但是线程池中只有一个123 这样做是为了节约资源,一般判断字符串相同用equals
      

  27.   

    我主要不懂的是
    String c="123";
    String d="123";
    为什么这两个用==判断会是true,
    如果按照上面几位的说法,难道改c的值d也会跟着变?
    但是测试的话是不会变的。
    这个String也不可能是基本类型。
      

  28.   

    这么说吧,==判断是两个变量引用的内存地址是否是同一个,equals()方法是判断这2个对象的内容是否一致,打个比方,如果宾馆里有2个房间,303,304里面住的都是张三,那么用==判断的话,因为地址不同(303和304房间号不同,所以是false,如果是用equals方法来判断,那么就判断的是房间里的人是否都是张三,因为都是住的张三,所以返回为true
      

  29.   

    去我的博客:http://blog.csdn.net/zhangerqing 找到专门讲字符串章节
    这个问题有深入的讲解。
      

  30.   

    注意看一下,在String来类型中“=”是所比较的是地址,而equals是则比较的是值。 前者在堆中的地址应该是不一样的,所以为false。而后者比较的是值是相等的,所以为true。
      

  31.   

    注意看一下,在String来类型中“=”是所比较的是地址,而equals是则比较的是值。 前者在堆中的地址应该是不一样的,所以为false。而后者比较的是值是相等的,所以为true。                                                                         普科学生