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
- Java String Split 方法小记录-源代码分析
- java String.split 方法
- JAVA String.split方法
- Java String.split()方法
- JAVA String.split()方法
- String.Split小记
- 关于JAVA string.split()方法。
- Java基础 String split方法
- JAVA String.split() 方法浅析
- Java String.split()方法注意事项
- Java String 源代码分析
- Java split方法源码分析
- java String.split()函数的用法分析
- java String.split()函数的用法分析
- java String.split()函数的用法分析
- java String.split()函数的用法分析
- java String.split()函数的用法分析
- java String.split()函数的用法分析
- 基础练习 完美的代价
- JSP过滤器Filter配置过滤类型汇总
- [Leetcode] #215 Kth Largest Element in an Array
- php中如何把多行文本框textarea提交上来的数据按照回车换行拆分成数组
- angular js和一些个人总结小技巧
- Java String Split 方法小记录-源代码分析
- HDU 2086 A1 = 杭电acm
- 文件上传--测试用例
- 2017年android面试总结
- RESTful API的理解
- React源码分析1 -- 框架
- 【菜鸟之路】Fibonacci数列
- linux常用命令
- 中介者模式(24)