2 u013740864 u013740864 于 2014.10.22 22:29 提问

String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1?

如题,这是代码:
String s = "A1B2C3D4E5F6G7H8";
String[] b = new String[8];
System.out.println("b:" + b.length);
b = s.split("[A-Z]");
System.out.println("b:" + b.length);
输出结果就是:
b:8
b:9

2个回答

three_man
three_man   2014.10.23 09:24

不是数组长度加1,是这个引用指向了新的数组。其相当于。
String[] b = new String[8];

b = new String[9];

你又赋了一遍值。

three_man
three_man 已经又回答了哈,你看一下呢
大约 3 年之前 回复
u013740864
u013740864 原来如此,感谢!再请教下,为什么split返回的新数组b[0]是null,从b[1]才开始存储第一个结果??
大约 3 年之前 回复
three_man
three_man   2014.10.23 14:18

不是数组长度加1,是这个引用指向了新的数组。其相当于。
String[] b = new String[8];

b = new String[9];

你又赋了一遍值。

基于你又问的问题哈。为什么第一个是空,你的这段代码在JDK中的实现如下:
String s = "A1B2C3D4E5F6G7H8";
Pattern p = Pattern.compile("[A-Z]");
Matcher m = p.matcher(s);

    int index = 0;
    ArrayList<String> matchList = new ArrayList<String>();
    boolean matchLimited = false;
    while(m.find()) {
        String match = s.subSequence(index, m.start()).toString();
        matchList.add(match);
        index = m.end();
    }
    String[] b = null;
    // Add remaining segment
    if (!matchLimited || matchList.size() < 0)
        matchList.add(s.subSequence(index, s.length()).toString());

    // Construct result
    int resultSize = matchList.size();
    while (resultSize > 0 && matchList.get(resultSize-1).equals("")){
        resultSize--;
    }
    String[] result = new String[resultSize];
    b = matchList.subList(0, resultSize).toArray(result);

    System.out.println("b0:" + b[0]);

使用的正则表达式。
然后用一个ArrayList来保存匹配到的字符。
有这样一段:String match = s.subSequence(index, m.start()).toString();
给list中的第一个元素赋的值为从0开始从匹配字符的开始位结束,就也是0了。所以list中的第一个元素就是空的。

后面还有一段:
while (resultSize > 0 && matchList.get(resultSize-1).equals("")){
resultSize--;
}
这一段把尾部的所有为空的都去除了,但是没有去除首部的,因此list中的第一个还是空。
最后转化为数组的时候第一个元素就是空了。

个人认为这个可以算JDK的一个小bug吧。

u013740864
u013740864 懂了!感谢您的耐心解答!
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!