Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我应该使用string.isEmpty()还是"&引用;。等于(字符串)?_Java_String - Fatal编程技术网

Java 我应该使用string.isEmpty()还是"&引用;。等于(字符串)?

Java 我应该使用string.isEmpty()还是"&引用;。等于(字符串)?,java,string,Java,String,我通常会将它与字符串==null一起测试,因此我并不真正关心空安全测试。我应该用哪一种 String s = /* whatever */; ... if (s == null || "".equals(s)) { // handle some edge case here } 或 注意,-doesisEmpty()甚至做了除之外的任何事情都返回这个.equals(“”)或返回此值。length()==0?这并不重要“.equals(str)在我看来更清楚 isEm

我通常会将它与
字符串==null
一起测试,因此我并不真正关心空安全测试。我应该用哪一种

String s = /* whatever */;
...
if (s == null || "".equals(s))
{
    // handle some edge case here
}


注意,-does
isEmpty()
甚至做了除
之外的任何事情都返回这个.equals(“”)
返回此值。length()==0

这并不重要<代码>“.equals(str)
在我看来更清楚


isEmpty()
返回
count==0

equals.equals(s)的主要优点是您不需要进行空检查(
equals
将检查其参数,如果为空,则返回
false
),而您似乎并不关心这一点。如果您不担心
s
为空(或者正在检查它),我肯定会使用
s.isEmpty()
;它精确地显示了您正在检查的内容,您关心代码< > >代码>是否是空的,而不是它是否等于空字符串

除了所提到的其他问题之外,您还需要考虑的一件事是<代码> iSunTyle()/<代码>在1.6中被引入,因此,如果您使用它,您将无法在Java 1.5或更低版本上运行代码。

String.equals(“”
实际上比仅调用
isEmpty()
要慢一点。字符串存储构造函数中初始化的计数变量,因为字符串是不可变的

isEmpty()
将count变量与0进行比较,而equals将检查类型、字符串长度,然后在大小匹配的情况下迭代字符串进行比较


所以为了回答你的问题,
isEmpty()
实际上做的要少得多!这是一件好事。

您可以使用apache commons isEmpty()或isNotEmpty()。

我编写了一个
测试仪
类,可以测试性能:

public class Tester
{
    public static void main(String[] args)
    {
        String text = "";

        int loopCount = 10000000;
        long startTime, endTime, duration1, duration2;

        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
            text.equals("");
        }
        endTime = System.nanoTime();
        duration1 = endTime - startTime;
        System.out.println(".equals(\"\") duration " +": \t" + duration1);

        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
            text.isEmpty();
        }
        endTime = System.nanoTime();
        duration2 = endTime - startTime;
        System.out.println(".isEmpty() duration "+": \t\t" + duration2);

        System.out.println("isEmpty() to equals(\"\") ratio: " + ((float)duration2 / (float)duration1));
    }
}
公共类测试器
{
公共静态void main(字符串[]args)
{
字符串文本=”;
int loopCount=10000000;
长起始时间、结束时间、持续时间1、持续时间2;
startTime=System.nanoTime();
for(int i=0;i


我发现使用
.isEmpty()
大约花费了
.equals(“”)的一半时间。我想说
str.isEmpty()
.equals(str)
要清楚得多。它读起来就像你正在检查的一样。不过我想这是个意见问题。我想有些人更喜欢用“.equals”(str)来避免NPE。我个人不喜欢它,因为我宁愿先检查字符串是否不为null。@CoolBeans是的。话虽如此,问题是:所以我并不真正关心空值安全测试。请记住,
isEmpty()
仅适用于Java 6+。您可以创建一个检查空值的助手方法Util.String.hasValue(String s),空格和空白处理所有的情况。@ ColinD可能不是问题- J2SE 5在一段时间之前完成了它的服务生命周期。另一个要考虑的是“.Errals:()以对象为参数,如果参数类型从字符串改变为其他,则不会得到编译器错误。无论是好是坏,我认为在这种情况下,区别并不适用;永远不会对字符串进行迭代以进行比较,因为大小不匹配(除非字符串实际为空,然后没有字符进行迭代)True,但使用equals时,首先进行引用检查以查看它们是否是相同的对象,然后是instanceof,然后是cast to string,长度检查,最后是迭代。如果两个字符串都是空的,那么它将只是一个简单的引用检查;这是一个活生生的答案,对我来说绝对不是问题。而且,这个答案是6年前的。我希望没有人再使用像Java1.5这样古老的东西了。事实上,在升级Java版本时,有很多东西会被破坏。对于在大型服务器上运行的后端应用程序来说,这不太重要,但对于客户端应用程序来说,这确实很重要。图形库和垃圾收集策略经常受到主要和次要java升级的影响。除此之外,客户端软件可以在各种操作系统上运行,有时内存有限,这意味着您通常没有足够的预算/资源来测试所有内容。-是的,我有一些客户在2017年仍然坚持使用Java 5。感谢您的解释。现在我知道为什么喜欢“.equals(str)而不是str.equals(“”)!我一直想知道为什么其他人这么频繁地使用它,但没有考虑空值。很棒:-)在上面的例子中仍然需要空检查,因为我们假设空值的条件应该为true。s==null | |“”.equals(s)@Master.Aurora否,如果
getValue()
返回null,则当
toString()
为called@RenniePet这并不是说这里面有什么魔法。如果
s
为null,则不能对其调用方法——它为null
永远不会为空,因此您可以安全地对其调用方法,
equals()
可以处理其参数为空的情况性能说明:
isEmpty()
检查私有数组的内部长度,而
equals(Object anObject)
做的更多(例如检查
instanceof
)。就性能而言,
isEmpty()
通常更快。这不是有效的微基准。我
public class Tester
{
    public static void main(String[] args)
    {
        String text = "";

        int loopCount = 10000000;
        long startTime, endTime, duration1, duration2;

        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
            text.equals("");
        }
        endTime = System.nanoTime();
        duration1 = endTime - startTime;
        System.out.println(".equals(\"\") duration " +": \t" + duration1);

        startTime = System.nanoTime();
        for (int i = 0; i < loopCount; i++) {
            text.isEmpty();
        }
        endTime = System.nanoTime();
        duration2 = endTime - startTime;
        System.out.println(".isEmpty() duration "+": \t\t" + duration2);

        System.out.println("isEmpty() to equals(\"\") ratio: " + ((float)duration2 / (float)duration1));
    }
}