这话说来就长了,已经讨论的很多了,用==比较的不是在比较值,
你试试String name = "zc1";这样用==比较就能执行

解决方案 »

  1.   

    引用类型比较值相等用equals,不能用=。用=比较出来的是两者指向的地址是否相同,比较的是栈值
      

  2.   

    无语了呀
    在Java里面不能用==来比较字符串,因为String是一个对象。只能用equals。
    如果是基本数据类型,就可以 用==
      

  3.   


    这些我知道,我只是想知道哪里错了,name的值打印出来时zc1,为什么equals就可以,==不可以
      

  4.   

    3.6.5 检测字符串是否相等
    可以使用equals方法检测两个字符串是否相等。
    如果字符串s与字符串t相等,则表达式s.equals(t)返回true;
    否则返回false。
    需要注意,s与t可以是字符串变量,也可以使字符串常量。
    一定不能使用==运算符检测两个字符串是否相等!
    这个运算符只能够确定两个字符串是否被放置在同一个位置。
    当然,如果字符串放在同一个位置,他们必然相等。
    但是,完全有可能将内容相同的两个字符串放在不同的位置上。
    如果虚拟机总是将相同的字符串共享,就可以使用==运算符检测是否相等。
    但实际上只有字符串常量是共享的,而+或substring等操作产生的结果都不是共享的。
    因此,永远都不要使用==运算符的测试字符串的相等性,否则在程序中会出现很糟糕的bug,从表面上看很像随机产生的间歇性错误!
    From《Java2核心技术第七版卷I,基础知识,Page49》
      

  5.   

    再补充一下,name的值肯定是一个含有zc1的字符串,我只是想知道,在通过session取值的时候多了些什么
    导致==没用,equals有用
      

  6.   


    额,不是哪里错了,而是name值是"zc1",并不代表它等于"zc1"因为name,这个对象在内存中涉及到栈、堆两个部分,栈里面记录的是堆的地址,堆里面的才是内容,当然也有可能是别的堆的地址。而我们用=比较时,比较的是栈里面的内容,这也就是说可能(这里说可能是只针对String,别的引用类型都是绝对的)两个对象指向不同的堆,即它们栈值不同,但这两个堆里面的内容却是相同的,这样new String("zc1") != "zc1"。可明白了点~~~