一、到底是“a==null”还是“null==a”?
答:两者无区别,它们源自c开发的一个规范导致。在c里,if(a=null)和if(a==null)都是合法的,
if(a=null)是赋值,接着把赋值的结果进行判断,if(a==null)为判断是否相等,这样时常会写错,
所以当时的规范规定,如果有常量参与判断的话,把常量放在前面,由于常量无法赋值,就会发生编译错误。
即a==null和null==a都是一样的。可是a==null可能会错误的写成a=null的话,而null==a不可能错误的写成null=a(会发生编译错误)。
所以这个规范流传至今。
可在Java中,if(a=null)是不合法的,所以这个规范就无意义了。但null是常量,有些人出于习惯就把它放前面了。
二、a.equals("true")和“true".equals(a)有什么区别?
答:当a为null,String对象就会是一个空对象,而空对象没有equals方法,则前者就会报空指针异常;
而,后者当a=null的时候,“true".equals(a)结果永远为false。
借用一段代码来解释如下:
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;
}
所以大神建议使用org.apache.commons.lang包下的StringUtils.equals(String str1,String str2)方法
源码如下:
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已帮我们绕过了坑。