Confusing output from String.split

前端 未结 8 1028
情深已故
情深已故 2020-12-08 06:33

I do not understand the output of this code:

public class StringDemo{              
    public static void main(String args[]) {
        String blank = \"\";         


        
8条回答
  •  南笙
    南笙 (楼主)
    2020-12-08 07:02

    From JDK 1.7

     public String[] split(String regex, int limit) {
            /* fastpath if the regex is a
               (1)one-char String and this character is not one of the
                  RegEx's meta characters ".$|()[{^?*+\\", or
               (2)two-char String and the first char is the backslash and
                  the second is not the ascii digit or ascii letter.
            */
            char ch = 0;
            if (((regex.count == 1 &&
                 ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
                 (regex.length() == 2 &&
                  regex.charAt(0) == '\\' &&
                  (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
                  ((ch-'a')|('z'-ch)) < 0 &&
                  ((ch-'A')|('Z'-ch)) < 0)) &&
                (ch < Character.MIN_HIGH_SURROGATE ||
                 ch > Character.MAX_LOW_SURROGATE))
            {
                int off = 0;
                int next = 0;
                boolean limited = limit > 0;
                ArrayList list = new ArrayList<>();
                while ((next = indexOf(ch, off)) != -1) {
                    if (!limited || list.size() < limit - 1) {
                        list.add(substring(off, next));
                        off = next + 1;
                    } else {    // last one
                        //assert (list.size() == limit - 1);
                        list.add(substring(off, count));
                        off = count;
                        break;
                    }
                }
                // If no match was found, return this
                if (off == 0)
                    return new String[] { this };
    
                // Add remaining segment
                if (!limited || list.size() < limit)
                    list.add(substring(off, count));
    
                // Construct result
                int resultSize = list.size();
                if (limit == 0)
                    while (resultSize > 0 && list.get(resultSize-1).length() == 0)
                        resultSize--;
                String[] result = new String[resultSize];
                return list.subList(0, resultSize).toArray(result);
            }
            return Pattern.compile(regex).split(this, limit);
        }
    

    So for this case, the regex will be handled by the first if.

    For the first case blank.split(",")

    // If no match was found, return this
    if (off == 0)
       return new String[] { this };
    

    So, this function will return an array which contains one element if there is no matched.

    For the second case comma.split(",")

    List list = new ArrayList<>();
    //...
    int resultSize = list.size();
    if (limit == 0)
        while (resultSize > 0 && list.get(resultSize-1).length() == 0)
               resultSize--;
    String[] result = new String[resultSize];
    return list.subList(0, resultSize).toArray(result);
    

    As you notice, the last while loop has removed all empty element in the end of the list, so the resultSize is 0.

提交回复
热议问题