首先:
第二:如果我执行以下其中一个函数会发生什么?
s.equals("")
和 "".equals(s)
有什么区别?第二:如果我执行以下其中一个函数会发生什么?
"".substring(1)
或者 "".charAt(0)
。s.equals("")
和 "".equals(s)
有什么区别?"".substring(1)
或者 "".charAt(0)
。关于equals方法,两种变体在结果上没有区别。但是第二个变体是nullsafe的。如果s
为空,第一个变体会抛出NullPointerException异常,而第二个变体则会被评估为false
。
第一个问题:如果s
不是null
,那么没有区别。如果s
是null
,那么s.equals("")
会抛出NullPointerException
,而"".equals(s)
只会返回false
。
第二个问题:这两个都会抛出IndexOutOfBoundsException
异常。
第一点:
对于两者来说,都是调用类的实例方法,因此在其内部没有任何区别。
值得注意的是,"".equals(s)
不太可能抛出 NullPointerException
。这是针对 String
类实现的:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
第二:
"".substring(1);
这个调用会抛出一个 IndexOutOfBoundsException
异常。根据 Java 文档,如果 beginIndex 是负数或大于此 String 对象的长度,则会发生异常。
"".charAt(0):
IndexOutOfBoundsException
- 如果索引参数为负数或不小于此字符串的长度。