记一个字符串比较的小坑!!
在Java中,我们用equals()来比较两个字符串的内容是否相等。
equals()方法是继承于顶级类Object的,然后又在String类中被覆写,专门用来比较两个字符串的内容是否相同!
典型用法为:str1.equals(str2) 输出为true,则表示str1,str2两个字符串内容相等;反之,则为不相等!
我的代码使用情况是这样的:从sqlite数据库取出数据,因为数据中有一个字段是FileName,我需要判断有哪些记录的FileName是一样的,然后把一样的记录抓在一起,然后再去使用。于是我先用了ORDERBY子句对数据输出进行排序,然后定义了一个FileNameTemp来做临时变量,用于存储当前记录中的FileName,并且判断它跟上一条记录的FileName是否一样。
核心代码如下:
String fileNameTemp=null;
while (rs.next()){
//取出当前记录的fileName
String fileName=rs.getString(1);
//判断字符串内容是否相等
if( ! fileNameTemp.equals(fileName)){
fileNameTemp=fileName;
//下面的具体操作省略
.............
}else{
//下面具体操作省略
..................
}
}
运行的结果是:第一条记录判断的时候,本该进入的if操作没有进入,反而进入了else代码块中。
进入debug调试,发现fileName是有值的,说明数据库没问题,发现第一次判断时,fileNameTemp是null。照理来讲
! fileName.equals(fileNameTemp)应该返回true,然后进入if 代码块的。事实是,他先进入了else代码块。
经过思考,发现问题出现在第一次时,fileNameTemp=null; null表示空,这让equals()判断出错!!!最后将if里面的判断换为
if( ! fileName.equals(fileNameTemp)) 调换了两个字符串的位置,问题得以解决!
总结:在使用equals()判断两个字符串内容相等时,一般情况下,str1.equals(str2)和str2.equals(str1)效果是一样的,但是如果某个字符串可能为null,则把这个字符串位置放在equals()的参数位置!如果两个字符串都有可能为null时,最好在一开始的时候进行判断,例如if(str == null)