String = null 和 String.isEmpty 有什么区别吗?

15

使用if语句检查字符串是否为空时,使用String = null和String.isEmpty()有什么区别吗?

例如:

public String name;

if(name == null)
{
    //do something
}
或者
public String name;

if(name.isEmpty())
{
    //do something
}

如果有任何不同之处(包括性能问题),请告诉我。


4
空字符串不是 null,而是 isEmpty() - Basile Starynkevitch
它们不可互换,因为它们彼此之间没有任何相似之处,所以比较它们的性能毫无意义。顺便问一下:如果特殊方法和运算符执行相同的操作,为什么要有特殊方法呢? - Peter Lawrey
你会得到NullPointerException异常。 - Abhinav Saxena
8个回答

49

空字符串是长度为零的字符串。null值根本没有字符串。

  • 如果s是空字符串,则表达式s == null将返回false
  • 如果字符串为null,则第二个版本将抛出NullPointerException异常。

这里是显示差异的表格:

+-------+-----------+----------------------+
| s     | s == null | s.isEmpty()          |
+-------+-----------+----------------------+
| null  | true      | NullPointerException |
| ""    | false     | true                 |
| "foo" | false     | false                |
+-------+-----------+----------------------+

1
我喜欢@mark-byers的那个表格,并且作为一个.NET开发者,我很想念stringValue.IsNullOrEmpty()返回布尔值。因此,我将其添加到了一个帮助类中: public static Boolean IsNullOrEmpty(String value){ return (value == null || (value != null && value.isEmpty())); } 现在,在应用程序代码中,我不需要再担心这个结构了: if(Helper.IsNullOrEmpty(mystring)) { // do something } - TonyG
1
@TonyG,你不需要 value != null,因为Java的 if 是懒惰的:如果它到达那个点,它已经不是null了,你可以安全地在值上运行 .isEmpty() - ಠ_ಠ
很棒的解释..! :) - Onkar Musale

3

已赋值为“” 的字符串不包含任何值,但是为空(长度=0),未实例化的字符串为null。


2

变量name不是一个字符串。它是指向字符串的引用

因此,空值检查确定name是否实际上引用了一个String。如果是,则(仅在这种情况下)可以执行进一步检查以查看其是否为空。即:

String name = null;  // no string
String name = "";    // an 'empty' string

这里有两种不同的情况。请注意,如果您没有先检查是否为null,那么您将尝试在空引用上调用方法,这就是当您遇到可怕的NullPointerException时的情况。


1

isEmpty() 方法用于检查空字符串 ""

如果在 null 实例上调用 isEmpty() 方法,则会抛出 NullPointerException 异常。


0

查看您的Java版本的源代码。

例如,在openjdk-7中:http://www.docjar.com/html/api/java/lang/String.java.html

  119       /** The count is the number of characters in the String. */
  120       private final int count;

  663       /**
  664        * Returns <tt>true</tt> if, and only if, {@link #length()} is <tt>0</tt>.
  665        *
  666        * @return <tt>true</tt> if {@link #length()} is <tt>0</tt>, otherwise
  667        * <tt>false</tt>
  668        *
  669        * @since 1.6
  670        */
  671       public boolean isEmpty() {
  672           return count == 0;
  673       }

0

isEmpty 用于检查字符串 ""。 最佳实践是检查:

if (str != null && !str.isEmpty() {
   // process string
}

0
如果您应用此代码:
if(name.isEmpty())
{
    //do something
}

name为null时,您将会收到NullPointerException异常。

null检查通常用于检查对象是否存在。
isEmpty检查通常用于检查现有String对象的内容是否为空。


0
这周我在修改一些旧的Java代码时遇到了这个问题,我在这里学到了我必须始终进行所有这些检查。答案确实是正确的,但我发现每次都很难记住,所以我决定编写一个小函数,在一个简单的调用中为我完成它。
有了这个,你总是能得到你想要的答案:
      public boolean StringIsNull(String pi_sChaine)
        {  boolean bTrueOrFalse = true;

           if (pi_sChaine == null || pi_sChaine.isEmpty())
             { bTrueOrFalse = true; }
           else
             { bTrueOrFalse = false; }

           return bTrueOrFalse;
        }

欢迎来到StackOverflow!请编辑您的答案,添加对代码的解释。这个问题已经 七年 了,并且已经有一个被接受的答案。添加解释将使您的答案更接近其他答案的质量,并减少被删除的可能性。 - Das_Geek
太好了!请直接在问题中添加您的解释,而不是在其下方作为评论。 - Das_Geek

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