String s1 = "abc" String s2 = "abc"
s1 == s2 是成立的
当时在做B/S或C/S的登录时为什么要用equals呢,为什么用==就不对呢
比如 if(password.equals("abc")){
             //登录成功  
     } 想不明白..........

解决方案 »

  1.   

    编译器比较聪明,把你的两个"abc"编译成了同一个object(因为反正String是immutable的,这样做不会出事),所以s1和s2此时指的是其实是同一个String object,当然s1==s2了。password.equals("abc"),这里password是你从其它地方得到的,"abc"是编译器编译时就规定好产生的一个object,它们俩自然就不可能是同一个String object。
      

  2.   

    String s1 = "abc" String s2 = "abc" 
    s1 == s2 是成立的这是因为"abc"这个字符串只有一份,两个String指向的都是这一个
    如果你这样写:String s1 = new String("abc"); String s2 = new String("abc");
    s1和s2就不会==,只是equals
      

  3.   

    熟悉C++的人对于两个字符串比较的代码一定很了解: 
    (string1==string2) 
    但在java中,这个代码即使在两个字符串完全相同的情况下也会返回false 
    Java中必须使用string1.equals(string2)来进行判断 补充 
    如果: 
    string s1=new String("Hello"); 
    string s2=new String("Hello"); 
    则(s1==s2)=false 如果: 
    string s1="Hello"; 
    string s2="Hello"; 
    则(s1==s2)=true; 
    因为他们指向的同一个对象。 如果把其他变量的值赋给s1和s2,即使内容相同,由于不是指向同一个对象,也会返回false。所以建议使用equals(),因为equals比较的才是真正的内容
      

  4.   

    这个问题前几天有人问过
    http://topic.csdn.net/u/20090301/21/7405d0a4-0c3a-4a00-8af4-05bc33ce572a.html
      

  5.   

    本来equals与==一样的,但String类里重载了equals()
      

  6.   

    这是java的基础的问题用==这样的相等是地址相等,如果是基本数据类型则是值相等,如果用equals来判断相等,也是地址的指向,如果一致则相等,但有几个特殊,像String、Date只要它们的值相等,则相等。不过,它的方法equals方法是可以重写的。
    String s1 = "abc" String s2 = "abc" 
    s1 == s2 是成立的 
    这样写是相等是,是由于"abc"是一个常量池。两个都一样。所以相等。
    如果你是从台输入的"abc"字符串,它不是常量池了。所以地址不一样了。
      

  7.   

    String里的equals方法只比较值,不比较地址,你输入password肯定不能用==了
      

  8.   


    这个很好的!
    String s1 = "abc"; String s2 = "abc";
    if(s1==s2)

    System.out.println("AAAAAAAAAAAAAA");

    if(s1.equals(s2))
    {
    System.out.println("BBBBBBBBBBB");
    }
      

  9.   

    ==是地址比较,equals是内容比较,看你需要那种?
      

  10.   

    楼主的这种方式是比较两个常量,自然是ture
      

  11.   

    Java中有一个字符串池,当你两个字符串的值是完全相同的时候那么这两个引用指向的是内存中同一个字符串,而"=="是进行地址判断,equals()是进行内容的判断
      

  12.   

    值比较与地址比较,这个我知道,Sting a="abc"是放在字符常量池中,关键是我不知道从表单提交过来的密码字符串是不是用new Sting("password")创建出来放在堆内存中,导致他们的地址不一样
      

  13.   

    从Object层次来说,==与equals是相同的,都是比较内存地址,也就是说比较两个引用是否指向同一个对象,是则返回true,否则返回false。很多类都overwrite了equals方法,最典型的是String类。String类先比较内存地址,如果相同,则返回true;否则继续比较,如果两者的内容相同,也返回true。
      

  14.   

     String类对equals方法进行了重写
      

  15.   

    equals是两个变量必须是一一对应的才能为真,==是内存地址比较,所以st1和st2虽然都赋给了abc的值,但是比较之后的结果也是不一样的
      

  16.   

    4楼分析的已经相当透彻了,两个String s = "abc"和两个String s = new String("abc")比较==的结果是不一样的。但是用String类中的equals方法比较的永远是值。
      

  17.   

    "==" 比较的地址
    "equals"比较的值