String#split поведение при разбиении пустой строки в соответствии с "s+"



Я новичок в Java. К сожалению, в Java есть много вещей, которые очень трудно понять новичку.



Например,



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


Выход равен



[]
1


Но почему? Я буду признателен, если кто-нибудь объяснит мне, почему длина массива равна 1.

592   3  

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 был введен гораздо раньше.

Даже если экземпляр строки пуст, он все равно является экземпляром строки, и "ничто" должно быть помещено где-то после split(). Это единственный элемент в массиве.

Если вы напечатаете str[0], то получите пустую строку. Реальное "ничего" было бы null, но чем вы получите NullPointerException (вы не можете вызвать split() на нулевое значение)

Введите описание изображения здесьпустая строка присутствует в местоположении 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

Comments

    Ничего не найдено.