Pourquoi dans Java 8 split parfois supprime les cordes à vide au début de la matrice de résultats?

Avant Java 8 lorsque nous nous sommes séparés sur la chaîne vide comme

String[] tokens = "abc".split("");

split mécanisme permettrait de diviser dans des lieux marqués avec |

|a|b|c|

parce que l'espace vide "" existe avant et après chaque caractère. Donc, comme résultat qu'il pourrait générer, au premier abord, ce tableau

["", "a", "b", "c", ""]

et plus tard sera supprimer la fuite des chaînes vides (parce que nous n'avons pas explicitement négative de la valeur à limit argument) de sorte qu'il sera enfin de retour

["", "a", "b", "c"]

Dans Java 8 split mécanisme semble avoir changé. Maintenant, quand nous utilisons

"abc".split("")

nous aurons ["a", "b", "c"] tableau au lieu de ["", "a", "b", "c"] donc, il semble que les cordes à vide au démarrage sont également supprimés. Mais cette théorie ne parvient pas parce que par exemple

"abc".split("a")

retourne un tableau avec une chaîne vide au début ["", "bc"].

Quelqu'un peut m'expliquer ce qui se passe ici et la façon dont les règles de split pour ce cas ont changé en Java8?

Java8 semble résoudre ce problème. Pendant ce temps, s.split("(?!^)") semble fonctionner.
Le comportement décrit dans ma question n'est pas un bug de pré Java-8 versions. Ce comportement n'était pas particulièrement très utile, mais il était encore correct (comme indiqué dans ma question), donc on ne peut pas dire qu'elle est "fixe". Je le vois plus comme une amélioration que nous pourrions utiliser split("") au lieu de cryptic (pour les personnes qui n'utilisent pas les regex) split("(?!^)") ou split("(?<!^)") ou quelques autres regexes.
Rencontré le même problème après mise à jour de fedora Fedora 21, fedora 21 est livré avec le JDK 1.8, et mon IRC application de jeu est brisé à cause de cela.
Cette question semble être la seule de la documentation de cette modification de rupture dans Java 8. Oracle gauche de leurs liste des incompatibilités.
Ce changement dans le JDK juste m'a coûté 2 heures de traque de ce qui est mal. Le code fonctionne très bien sur mon ordinateur (JDK8) mais échoue mystérieusement sur une autre machine (JDK7). Oracle DEVRAIT VRAIMENT mise à jour de la documentation de String.split(String regex), plutôt que dans le Modèle.split ou Chaîne.split(String regex, int limite) car c'est de loin le plus courant d'utilisation. Java est connu pour sa portabilité aka soi-disant WORA. C'est un grand arrière-modification de rupture et de ne pas bien documenté.

OriginalL'auteur Pshemo | 2014-03-28