在项目开发中遇到一个Java 字符 比较的问题,
比较两个字符串不相等,开始使用的 “!=”,后来发现总是有问题,修改为使用equals 函数后,执行没问题了。
原因是:“==”,"!=" 比较的是两个对象是否相等。而equals 比较的是字符串内容是否相同。
参考了这个文章
http://blog.youkuaiyun.com/chtnj/article/details/7909720
判断字符串相等我们经常习惯性的写上if(str1==str2),这种写法在Java中可能会带来问题。
java中判断字符串是否相等有两种方法:
1、用“==”运算符,该运算符表示指向字符串的引用是否相同,比如: String a="abc";String b="abc",
那么a==b将返回true。这是因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存
一份,所以a和b指向的是同一个对象;再比如:String a=new String("abc"); String b=new String("abc");
那么a==b将返回false,因为a和b指向不同的对象。
2、用equals方法,该方法比较的是字符串的内容是否相同,比如:String a=new String("abc");
String b=new String("abc"); a.equals(b);将返回true。所以通常情况下,为了避免出现上述问题,判断
字符串是否相等使用equals方法。
http://blog.youkuaiyun.com/u013457382/article/details/50996533
Java中String类型具有一个equals的方法可以用于判断两种字符串是否相等,但是这种相等又与运算符==所判断的“相等”有所不同,接下来进行分析,结论由程序进行验证
String的equals函数只要两个字符串“看起来”相等,就可以返回true,“看起来”相等意思指的是,当两个字符串对象所存放的内容相同时,不需要存放的内存地址相同,但是==判断则只有当判断的两个变量所使用的内存地址为相同时才返回true。例如有两个长得一模一样的双胞胎A,B,若使用A==B来判断会返回false,使用A.equals(B)则会返回true。
我们可以看object中的equals函数的源码为
我们知道Java中所有的对象都默认继承自Object类,所以当我们没有重写equals的方法时,若使用equals来判断两个对象的是否相等时,只有这两个对象指向的是同一个内存地址时,才会返回true,否则即使内容完全相同但在内存中是两个不同的内存地址也是返回false,此时若用双胞胎A,B来对比,A==B与A.equals(B)返回的都是false,
既然如此,那String的equals与==为什么会不一样呢,这里我们要看一下String中重写equals的源码:
可以看出String中的equals函数首先判断其内存地址是否为同一个:
然后再判断其内容是否相同: