private static String[] splitWorker(String str, char separatorChar, boolean preserveAllTokens) {
        // Performance tuned for 2.0 (JDK1.4)

        if (str == null) {
            return null;
        }
        int len = str.length();
        if (len == 0) {
            return ArrayUtils.EMPTY_STRING_ARRAY;
        }
        List<String> list = new ArrayList<String>();
        int i = 0, start = 0;
        boolean match = false;
        boolean lastMatch = false;
        while (i < len) {
            if (str.charAt(i) == separatorChar) {
                if (match || preserveAllTokens) {
                    list.add(str.substring(start, i));
                    match = false;
                    lastMatch = true;
                }
                start = ++i;
                continue;
            }
            lastMatch = false;
            match = true;
            i++;
        }
        if (match || preserveAllTokens && lastMatch) {
            list.add(str.substring(start, i));
        }
        return list.toArray(new String[list.size()]);
    }
Performs the logic for the {@code split} and
{@code splitPreserveAllTokens} methods that do not return a
maximum array length.

@param str  the String to parse, may be {@code null}
@param separatorChar the separate character
@param preserveAllTokens if {@code true}, adjacent separators are
treated as empty token separators; if {@code false}, adjacent
separators are treated as one separator.
@return an array of parsed Strings, {@code null} if null String input
android/android_framework/base/src/main/java/lang3/StringUtils.java