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}
新闻热点
疑难解答