日期:2014-05-18  浏览次数:20792 次

String 比较不相等的问题?求解
在项目中(SpringMVC+Mybatis)
在oracle数据库中,有一个表audit,其中的auditresu字段(审核结果),值为:已纳入《新技术目录》(varchar)
当我从数据库中取出audit对象,
并用其做判断时if(audit.getAuditResu()==“已纳入《新技术目录》)”  -----------①
结果是false ,
但是audit.getAuditResu()输出确实为“已纳入《新技术目录》”

对此,我作出修改,
将“已纳入《新技术目录》”设为常量YNRXJSML,放在STATUS类里
再次判断if(audit.getAuditResu().equals(STATUS.YNRXJSML)) ------②
结果为true

为什么呢?
在①中,==的左右两边难道一个在StringPool里,一个不在?

我是菜鸟,java有办法输出引用地址吗,好歹让我知道是什么问题。

------解决方案--------------------
引用:
我记得==比较的是引用,我用的是jdk7,
在StringPool里是根据hash值,同样的字符串返回的是同一个引用


equals方法、它用来比较字符串是否相等、如果直接等于(==)判断那么(==)判断的是目标地址是否相等、而不是两个字符是否一样。看下面的代码:

String str1 = "胡汉三很懒";  
String str2 = "胡汉三很懒";  
System.out.println(str1==str2);  
System.out.println(str1.equals(str2)); 
 
这样的结果都是true。
为什么呢、因为str1跟str2的目标地址是一样的。在核心技术卷一中、不可变字符串小节有讲到:"编译器可以让字符串共享、为了弄清具体的工作方式,可以想像将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。"。但是很多时候我们总是人为的new一个新的字符、人为hold住了java字符串的共享机制。
如下面一段代码:

String str1 = "胡汉三很懒";  
String str2 = new String("胡汉三很懒");  
System.out.println(str1==str2);  
System.out.println(str1.equals(str2));
  
这样过后、str1=str2终于false了。因为他们不在共享存储池中存放字符地址了!new关键字给str2对象开辟了另一个存储空间。从而使目标地址不在一致。
所以便有了在java中比较字符串是否相等得用equals方法的编程习惯。因为有时候、很多时候我们使用的字符串的目标地址都是不一致的。

你认为,你实体类里面存储的字符串地址会跟你自己又重新声明的字符串地址一样么?