字符串#根据" \ s +"分割空字符串时的拆分行为

时间:2015-09-30 09:19:38

标签: java arrays split

我是Java的新手。不幸的是,在Java中,很多新东西很难理解这些东西。

例如,

#db/seed.rb
categories = %w(cat1 cat2 cat3)
categories.each do |category|
   Category.find_or_create_by(name: category)
end

$ git add .
$ git commit -a -m "Categories"
$ git push heroku master

$ heroku run rake db:seed

输出

String str = "";
String[] arr = str.split("\\s+");
System.out.println(Arrays.toString(arr));
System.out.println(arr.length);
System.exit(0);

但为什么呢?如果有人能解释为什么数组的长度为1,我将不胜感激。

3 个答案:

答案 0 :(得分:10)

即使String实例为空,它仍然是一个String实例,并且"没有"必须放在split()之后的某个地方。那是数组中的一个元素。

如果你打印str[0],你会得到一个空字符串。真实的"没什么"将是null,但是您会得到NullPointerException(您无法在空值上调用split()

答案 1 :(得分:7)

enter image description here空字符串出现在分割数组的Ist位置。

public static void main(String[] args) {
        String str = "";
        String[] arr = str.split("\\s+");
        System.out.println(Arrays.toString(arr));
        System.out.println(arr[0]);
        System.out.println(arr.length);
        System.exit(0);
    }

<强>输出

[]

1

答案 2 :(得分:3)

让我们来看看Arrays.toString的实施情况:

public static String toString(Object[] a) {
    if (a == null)
        return "null";
    int iMax = a.length - 1;
    if (iMax == -1)
        return "[]";

    StringBuilder b = new StringBuilder();
    b.append('[');
    for (int i = 0; ; i++) {
        b.append(String.valueOf(a[i]));  // Let's print that!
        if (i == iMax)
            return b.append(']').toString();
        b.append(", ");
    }
}

现在由于数组不为空,我们将进入for循环。 我们首先将[附加到结果中。然后我们追加String.valueOf(a[i])。让我们尝试打印它:

String str = "";
String[] arr = str.split("\\s+");
System.out.println(String.valueOf(arr[0]));

你会看到输出是......什么都没有!所以最终的结果是:

[]

请注意,这与Java 8无关。split方法已引入much earlier