package cc.openhome;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@WebServlet("/hello.view")
public class HellowServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
// TODO Auto-generated method stub

String username = request.getParameter("username");
String passwd = request.getParameter("password");
if(checkLogin(username, passwd)){
System.out.println("welcome");
}
else{
System.out.println("sorry");
}

} private boolean checkLogin(String username, String passwd) throws IOException {
// TODO Auto-generated method stub
String user1 = "zhangsan";
String user2 = "lisi";
String psd1 = "123";
String psd2 = "234";
  if(username==user1 && passwd==psd1){
return true;
}
else if(username==user2 && passwd==psd2){
return true;
}
else{
return false;
}
}}这里的if(username==user1 && passwd==psd1){
return true;
}
else if(username==user2 && passwd==psd2){
return true;
}
else{
return false;
}和下面的有什么不同吗?改为equals就正确,我认为这两个是一样的,请大神指点......
public class Test { public static void main(String[] args) {
// TODO Auto-generated method stub
String test="test";

if(test=="test"){
System.out.println("相等");
}
}
}
java相等equals==

解决方案 »

  1.   

    比较字符串内容是否相等,用equals.
      

  2.   

    如上面那位所说比较字符串是否相等用equals,之所以前后不一样是因为 == 是比较对象的,上面那个因为是两个对象他们的地址不同所以不相等的。还有一个String具有缓冲池的特性也需要注意。
      

  3.   

    http://blog.csdn.net/wangweitingaabbcc/article/details/5993248 参照。
      

  4.   


    String str = "abc";
    String anotherStr = "abc";
    System.out.println(str == anotherStr);对于String,Java会维持一个常量池,在普通main方法中运行的话,应该是true;
    这里走了Servlet,我试了一下,是不相等的,我估计会不会是本地的JVM和Tomcat的内存什么的不太一样啊,求解释!!!
      

  5.   

    equals比较的是值,而==是比的值地址,也就是对象的引用
      

  6.   

    樓上說的都沒錯。。其實兩個只是看起來相似,其實是不一樣的,第一段代碼如下:
    if(username==user1 && passwd==psd1){
                return true;
            }
            else if(username==user2 && passwd==psd2){
                return true;
            }
            else{
                return false;
            }
    這裡的username 是個形式參數 user1是自己定義的一個局部變量,這是兩個不同的變量,它們有可能是兩個對象,注意是有可能! 所以當你用==進行比較的時候,結果不一定。 但是第二段代碼 如下:
    public class Test {
     
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            String test="test";
             
            if(test=="test"){
                System.out.println("相等");
            }
        }
    }
    與第一個不同的是,只有一個String變量 test,所以就是自己跟自己進行比較了,結果就為true啦
      

  7.   

    5楼应该说的是正确的。估计会不会是本地的JVM和Tomcat的内存什么的不太一样对SSH没有了解过,==是对象比较,只要是相同对象的都可以比较。
    在JAVA的字符串处理中有个字符串池,如果池中存在的字符串,是不会被新创建对象。
    因字符串是常量,故可以直接引用,既然是同一个对象,那么用==进行比较则为true了。
      

  8.   

    谢谢您的回答,但是我这里的user1和psd1换成普通的字符串if(username=="zhangsan" && passwd=="123"){
    return true;
    }
    else if(username=="lisi" && passwd=="234"){
    return true;
    }
    else{
    return false;
    }也不行......
      

  9.   

    我觉得我这里的username这个引用是和普通的字符串"zhangsan","lisi"(就是你所说的字符串池中的字符串)在比较,不知道理解的对不对?
      

  10.   

    http://bbs.csdn.net/topics/270042906
    这篇文章倒是可以看看,是不是这里的 String username = request.getParameter("username");         String passwd = request.getParameter("password"); 
    是heap中,而我建立的字符串是在String pool中地址不同,所以不能用"=="比较。
    不知道这样理解对不对?求板砖
      

  11.   

    谢谢您的回答,但是我这里的user1和psd1换成普通的字符串if(username=="zhangsan" && passwd=="123"){
    return true;
    }
    else if(username=="lisi" && passwd=="234"){
    return true;
    }
    else{
    return false;
    }也不行......那麼對於這種情況 如果你傳入的username值也為"lisi" passwd為"234" 結果應該為true了,否則為false,但這樣其實比較的不是內容是地址。 根本原因就在於 字符串==比較的是引用地址值,字符串維護了一個字符串池,所有只要不是new出來的字符串 那麼相同的內容 會返回同樣的地址值,而不同的內容 肯定有兩個不同的地址值啦,String類的源代碼你可以看下,它重寫了hashcode和equals方法,所以如果你想要比較兩個字符串中的內容時 用equals方法 不要用==
      

  12.   


    没错。你可以试一下 String username = request.getParameter("username").intern();
    intern() 方法返回与此 String 相等(equals)的常量池里的实例引用。
      

  13.   

    我认为你应该好好区分一下“==”与String类型的equals方法,"=="是用来比较对象的,在你的代码中username和user1指向不同的对象,passwd和psd1同样指向不同的对象,因此返回false,而equals是将字符串逐个逐个比较,因而建议在做字符串比较的时候用equals。
      

  14.   

    关于equals方法确实有好多内容的,Object类的此方法是比较地址,但是String 调用的此方法已经进行了方法重写,比较的是字符串内容。
      

  15.   

    字符串比较用equals()方法,不应该用==
    不过好像jdk1.7支持用等号了,以前的版本是不行的。
    建议在比较字符串时还是用equals()方法