String的一个小问题,弄了好久没弄明白 这话说来就长了,已经讨论的很多了,用==比较的不是在比较值,你试试String name = "zc1";这样用==比较就能执行 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 引用类型比较值相等用equals,不能用=。用=比较出来的是两者指向的地址是否相同,比较的是栈值 无语了呀在Java里面不能用==来比较字符串,因为String是一个对象。只能用equals。如果是基本数据类型,就可以 用== 这些我知道,我只是想知道哪里错了,name的值打印出来时zc1,为什么equals就可以,==不可以 3.6.5 检测字符串是否相等 可以使用equals方法检测两个字符串是否相等。 如果字符串s与字符串t相等,则表达式s.equals(t)返回true; 否则返回false。 需要注意,s与t可以是字符串变量,也可以使字符串常量。 一定不能使用==运算符检测两个字符串是否相等! 这个运算符只能够确定两个字符串是否被放置在同一个位置。 当然,如果字符串放在同一个位置,他们必然相等。 但是,完全有可能将内容相同的两个字符串放在不同的位置上。 如果虚拟机总是将相同的字符串共享,就可以使用==运算符检测是否相等。 但实际上只有字符串常量是共享的,而+或substring等操作产生的结果都不是共享的。 因此,永远都不要使用==运算符的测试字符串的相等性,否则在程序中会出现很糟糕的bug,从表面上看很像随机产生的间歇性错误!From《Java2核心技术第七版卷I,基础知识,Page49》 再补充一下,name的值肯定是一个含有zc1的字符串,我只是想知道,在通过session取值的时候多了些什么导致==没用,equals有用 额,不是哪里错了,而是name值是"zc1",并不代表它等于"zc1"因为name,这个对象在内存中涉及到栈、堆两个部分,栈里面记录的是堆的地址,堆里面的才是内容,当然也有可能是别的堆的地址。而我们用=比较时,比较的是栈里面的内容,这也就是说可能(这里说可能是只针对String,别的引用类型都是绝对的)两个对象指向不同的堆,即它们栈值不同,但这两个堆里面的内容却是相同的,这样new String("zc1") != "zc1"。可明白了点~~~ java中如何用openssl生成的公钥来加密字符串 AWT/Swing中GIF动画是怎么update的 hibernate.cfg.xml 问题配置问题 用java拨打手机号码 关于界面,对象分离的问题 怎么使jbuilder的编译加上参数 -target 1.1 怎样才能跟上JAVA的神速发展? 看看这个东西代表什么意思double[][][] printData = new double[cityNum][tradeNum][24]; 问一个有关applet的问题 两位斑竹,各位大虾,介绍一下各种开发工具的主要开发方向吧! 一个集合的遍历问题 一个布局管理器问题
在Java里面不能用==来比较字符串,因为String是一个对象。只能用equals。
如果是基本数据类型,就可以 用==
这些我知道,我只是想知道哪里错了,name的值打印出来时zc1,为什么equals就可以,==不可以
可以使用equals方法检测两个字符串是否相等。
如果字符串s与字符串t相等,则表达式s.equals(t)返回true;
否则返回false。
需要注意,s与t可以是字符串变量,也可以使字符串常量。
一定不能使用==运算符检测两个字符串是否相等!
这个运算符只能够确定两个字符串是否被放置在同一个位置。
当然,如果字符串放在同一个位置,他们必然相等。
但是,完全有可能将内容相同的两个字符串放在不同的位置上。
如果虚拟机总是将相同的字符串共享,就可以使用==运算符检测是否相等。
但实际上只有字符串常量是共享的,而+或substring等操作产生的结果都不是共享的。
因此,永远都不要使用==运算符的测试字符串的相等性,否则在程序中会出现很糟糕的bug,从表面上看很像随机产生的间歇性错误!
From《Java2核心技术第七版卷I,基础知识,Page49》
导致==没用,equals有用
额,不是哪里错了,而是name值是"zc1",并不代表它等于"zc1"因为name,这个对象在内存中涉及到栈、堆两个部分,栈里面记录的是堆的地址,堆里面的才是内容,当然也有可能是别的堆的地址。而我们用=比较时,比较的是栈里面的内容,这也就是说可能(这里说可能是只针对String,别的引用类型都是绝对的)两个对象指向不同的堆,即它们栈值不同,但这两个堆里面的内容却是相同的,这样new String("zc1") != "zc1"。可明白了点~~~