对String 的判断我大意了,没有闪!!!!!
我们经常写代码的时候会做String字符串的判断。equals是我们经常用的。今天写代码的时候又习惯性的进入了坑中。
equals 的顺序不同导致的结果不同。
我们来看一下下面的写法会出现什么问题
场景一:
String testString="";
testString.equals("");
场景二:
String testString=null;
testString.equals("");
场景三:
String testString="";
"".equals(testString);
场景四:
String testString=null;
null.equals(testString);
场景五:
String testString=null;
"null".equals(testString);
场景六:
String testString=null;
System.out.println(testString==null);
场景七:
String testString=new String("");
String testString2=new String("");
System.out.println(testString==testString2);
System.out.println(testString.equals(testString2));
输出的结果
场景一:true
场景二:java.lang.NullPointerException
场景三:true
场景四:代码错误
场景五:false
场景六:true(比较字符串不建议用)
场景七:false true
剖析:场景二中的testString=null,String对象就会是一个空对象,空对象说明没有equals方法,所以就会报空指针异常;有人说了 “” 为什么不报呢,因为"“是一个对象,内容为”",但是他有内存空间。而null呢,不会创建对象,没有内存空间。场景五中testString=null,“null”.equals(testString);结果永远都为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;
}
而场景六中 虽然得到是true 但是他们比较的东西确实是不相同的。null为内存为空,“”为内容为空。
得到true是因为拿null的内存去比较""的内容。所以就能看到场景七的结果。