equals方法变量在前或者在后有什么区别吗?何止有区别!简直坑人!
public class Test {
public static void main(String[] args) {
System.out.println(new Test().isBool(null));
}
public boolean isBool(String a){
return a.equals("true");
}
如上述代码:a.equals(“true”);和"null".equals(a);有什么区别的?
答案就是前者会抛空指针异常,后者则不会
很简单, 如果a = null ,那么String对象就是一个空对象,空对象哪来的方法呢?所以就会报空指针异常 .
而如果"null".equals(a) , a = null 结果永远为false,为什么呢 直接看源码
下面展示一些 内联代码片
。
equals源码
// An highlighted block
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
//判断anObject是否为String类型
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
可以得知equlas方法是先比较是否为同一对象,是就直接返回true,否则比较对象类型,不是直接false 如果是就比较String类型的值是否相同,是就返回true.
为了避免上述的坑点,可以直接使用
org.apache.commons.lang包下的StringUtils.equals(String str1, String str2)方法
下面展示一些 内联代码片
。
// A code block
源码
// An highlighted block
public static boolean equals(String str1, String str2)
{
return str1 != null ? str1.equals(str2) : str2 == null;
}
//忽略大小写进行比较
public static boolean equalsIgnoreCase(String str1, String str2)
{
return str1 != null ? str1.equalsIgnoreCase(str2) : str2 == null;
}
看到StringUtils.equals这个方法了吧。他已经帮你绕过了那个坑,我还是比较推荐大家多用用StringUtils工具类里面的方法,
毕竟是人家封装好的,可以直接拿来用,尽量少走弯路
说的浅显一点 equlas方法比较的是字符串的内容是否相同;
而 == 比较的是变量本身的值 是内存中的地址;
对于非字符串变量来说 本来equlas方法也是比较地址的,String方法中是重写了equals方法而已,具体问题具体分析;
如果是基本类型比较,那么只能用==来比较,不能用equals
// An highlighted block
public class TestEquals {
public static void main(String[] args){
int a = 3;
int b = 4;
int c = 3;
System.out.println(a == b);//结果是false
System.out.println(a == c);//结果是true
System.out.println(a.equals(c));//错误,编译不能通过,equals方法
//不能运用与基本类型的比较
}
}
对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。比如:
// An highlighted block
public class TestEquals {
public static void main(String[] args){
Integer n1 = new Integer(30);
Integer n2 = new Integer(30);
Integer n3 = new Integer(31);
System.out.println(n1 == n2);//结果是false 两个不同的Integer对象,故其地址不同,
System.out.println(n1 == n3);//那么不管是new Integer(30)还是new Integer(31) 结果都显示false
System.out.println(n1.equals(n2));//结果是true 根据jdk文档中的说明,n1与n2指向的对象中的内容是相等的,都是30,故equals比较后结果是true
System.out.println(n1.equals(n3));//结果是false 因对象内容不一样,一个是30一个是31
}
}
这是Integer的实例,如果是其他的比如Double、Character、Float等也一样。