s.equals("")和"".equals(s)有什么区别?

3
首先: s.equals("")"".equals(s) 有什么区别?
第二:如果我执行以下其中一个函数会发生什么?"".substring(1) 或者 "".charAt(0)

4
对于你的第二个问题,是什么阻止了您运行一些代码并查看结果呢?您甚至可以在浏览器上的几个网站上在线运行Java。 - CollinD
1
请每个帖子只提出一个问题。 - Pshemo
2
高度相关:https://dev59.com/5mkw5IYBdhLWcg3wbqKZ - Tunaki
如果您无法运行第二个示例,可以阅读文档,文档会告诉您发生了什么。 - Peter Lawrey
3个回答

7

关于equals方法,两种变体在结果上没有区别。但是第二个变体是nullsafe的。如果s为空,第一个变体会抛出NullPointerException异常,而第二个变体则会被评估为false


6

第一个问题:如果s不是null,那么没有区别。如果snull,那么s.equals("")会抛出NullPointerException,而"".equals(s)只会返回false

第二个问题:这两个都会抛出IndexOutOfBoundsException异常。


0

第一点:

对于两者来说,都是调用类的实例方法,因此在其内部没有任何区别。

值得注意的是,"".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 - 如果索引参数为负数或不小于此字符串的长度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接