String的split方法相信你们都不陌生,或多或少都用过它将字符串转成一个数组,可是就是这样一个简单的方法,里面也有一个不得不注意、不深不浅的小坑。数组
本地测试代码以下图所示:测试
图1debug
你们会发现split1跟split3的长度符合咱们的预期,可是split2应该是长度为5,但实际长度却仍然为4。相信你们在遇到这种状况的时候,blog
应该能立马猜到String的这个split方法应该不仅是进行一个匹配拆分的操做,还作了其余的逻辑处理,好比这里应该作了去除最后一个空元素字符串
的操做。既然有了这样的猜测,那就继续看看源码寻根溯源一下吧。源码
图2it
该方法调用了一个重载的方法,第一个参数没变,第二个参数limit传了0,继续追溯循环
图3遍历
却发现有点头大,比较麻烦,彻底看不下去了。bug
换个思路,debug一下,看看这最后一个空的元素是在哪里被过滤掉的,一试果真发现了案发地。
图4
此处的list里存放的是所有的5个元素,而在下面的while循环里,能够看到是从尾部往前遍历看哪一个元素长度为0,
有一个为0的就减一个长度,直到碰到第一个不为空的元素为止。进行完这个while循环以后,就截取前面的元素,
转成数组返回。
经过以上的简要分析,便可知道,对于String的split方法,若是字符串末尾恰好是匹配字符,则会自动将最后一个
空元素去掉,而字符串首部有空元素则不受影响。
多说两句,其实对于limit参数,测试几回即可发现,此参数是限制返回的数据最大长度的。测试代码以下:
图5
可知传了limit值,就不会自动去掉末尾的空元素。具体缘由可见图4源码,若是limit不为0,则不会走if中的while循环,也就不会出现上文中说的状况了。
对于这种坑,没什么避免的好办法,一是扩大本身的知识面,二是多积累总结。加油吧!