Java String Split 方法小记录-源代码分析

来源:互联网 发布:飞行器控制用什么编程 编辑:程序博客网 时间:2024/06/04 00:22
对于初学者来说,String 的 split 隐藏着许多不为人知的秘密,不多BB,上菜吧
 
public static void main(String[]args){        String str[] = ",,".split("");        System.out.println("长度:"+str.length);        for(String s:str){            System.out.println("字符串:"+s);        }        System.out.println("==============");        String str2[] = ",,".split("_");        System.out.println("长度:"+str2.length);        for(String s:str2){            System.out.println("字符串:"+s);        }    }

这段代码,打印出什么呢?  打印的结果是:
长度:3
字符串:
字符串:,
字符串:,
==============
长度:1
字符串:,,
问题1: 为什么长度是3,而不是4呢?开始长度为0的字符串“” 和最后一样的“”字符串,只返回了开始的,最后的长度为0的字符串被忽略了?
问题2:split参数中传入一个字符串中不包含的字符串,则返回整个字符串?
于是我查了一下相关源代码,接下来让我来浅析一下源代码吧,为了便于阅读,我就直接在代码后面作注释了:

public String[] split(String regex, int limit) {        return Pattern.compile(regex).split(this, limit);    }    public String[] split(String regex) {        return split(regex, 0);    }    //javase 1.7api中String类的split方法    public String[] split(String regex, int limit) {        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 < '0' && ch > '9' 时, 返回 true ,  也就是: (负数 | 负数) <0 ; 下同理                        ((ch-'a')|('z'-ch)) < 0 &&                        ((ch-'A')|('Z'-ch)) < 0)) &&                        (ch < Character.MIN_HIGH_SURROGATE ||                                ch > Character.MAX_LOW_SURROGATE))                                 //  utf-16 编码中的 unicode 高代理项代码单元的最小值。高代理项也称为前导代理项。        {            int off = 0;            int next = 0;            boolean limited = limit > 0;            ArrayList<String> list = new ArrayList$amp;             while ((next = indexOf(ch, off)) != -1) {               if (!limited || list.size() < limit - 1) {                    list.add(substring(off, next));                    off = next + 1;                } else {             // last one ,如果传入返回数组长度,则 打到限制长度后,添加off 到原字符串末尾的字符串。                    //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)   // 问题2的解答:如果未到长度限制,或者未传入第二个参数,添加 off 到末尾的字符串                list.add(substring(off, count));            // Construct result            int resultSize = list.size();            if (limit == 0)                while (resultSize > 0 && list.get(resultSize-1).length() == 0)                      resultSize--;                                                                // 问题1解答:如果我们不传入split的第二个参数,或者传0,那么最后此方法会从添加的最后一个元素开始,循环删除掉长度为0的“”字符串直到遇到第一个不为空的字符串(从后面开始的,所以就是遇到最后一个不为空的字符串时,停止删除),;            String[] result = new String[resultSize];            return list.subList(0, resultSize).toArray(result);        }        return Pattern.compile(regex).split(this, limit);             /// 关于这个的话,需要了解一下正则表达式了,我给一篇好问题:https://my.oschina.net/u/1187481/blog/215379}


 
 

0 0
原创粉丝点击