String.split(String) has surprising behaviour. For example, consider the following puzzler from http://konigsberg.blogspot.com/2009/11/final-thoughts-java-puzzler-splitting.html:
String[] nothing = "".split(":"); String[] bunchOfNothing = ":".split(":");
The result is [""] and []!
More examples:
| input | input.split(":") | Splitter.on(':').split(input) |
|---|---|---|
"" | [""] | [""] |
":" | [] | ["", ""] |
":::" | [] | ["", "", "", ""] |
"a:::" | ["a"] | ["a", "", "", ""] |
":::b" | ["", "", "", "b"] | ["", "", "", "b"] |
Prefer either:
Guava's Splitter, which has less surprising behaviour and provides explicit control over the handling of empty strings and the trimming of whitespace with trimResults and omitEmptyStrings.
String.split(String, int) and setting an explicit ‘limit’ to -1 to match the behaviour of Splitter.
TIP: if you use Splitter, consider extracting the instance to a static final field.