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.
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()на нулевое значение)

Comments