Разбиение строки с использованием пустой строки в качестве разделителя дает пустую строку, но не пустую строку

Предположим, что у вас есть это выражение в Java:

"adam".split("")

Это говорит Java о разделении "adam" с использованием пустой строки ("") в качестве разделителя. Это дает:

["", "a", "d", "a", "m"]

Почему Java включает пустую строку в начале, но не в конце? Используя эту логику, не должно быть результата:

["", "a", "d", "a", "m", ""]

Ответ 1

Разделитель является регулярным выражением. Регулярное выражение "" соответствует в самом начале строки (до a в adam). Состояние docs:

Разделяет эту строку вокруг совпадений данное регулярное выражение.

Поэтому метод будет разбиваться вокруг матча до a. В документах также говорится:

Этот метод работает так, как будто метод разделения с двумя аргументами с данное выражение и предельный аргумент от нуля. Пустые пустые строки поэтому не включены в результирующий массив.

и

Если n равно нулю то шаблон будет применяться как во много раз больше, массив может имеют длину и длину пустого строки будут отброшены ".

Следовательно, хотя в конце строки также будет совпадение, конечная пустая строка, которая будет получена, будет отброшена. Следовательно, ведущая пустая строка, но не конечная пустая строка. Если вы хотите получить пустую строку, просто передайте отрицательное значение в качестве второго аргумента:

"adam".split("", -1);

Это работает из-за этой цитаты из документов:

Если n не положительно, то шаблон будет применяться столько раз, сколько возможно, и массив может иметь любой длина.

Чтобы ответить на вопрос "почему в середине нет пустых строк?", регулярное выражение возвращает только одно совпадение для каждого места в строке. Поэтому не может быть двух совпадений между двумя последовательными символами в строке, поэтому, возвращаясь к моей первой цитате из документов, эти дополнительные пустые строки не будут присутствовать.

Ответ 2

Глядя на API для метода split, этот текст: "Таким образом, пустые строки не включаются в результирующий массив".

Ответ 3

Да, но есть пустые строки между "a" и "d", "d" и "a" , "a" и "m". И они также не отображаются в возвращенном массиве.

split() метод удаляет другие вхождения этой пустой строки.