MaiTianChen 2014-10-22 14:29 采纳率: 100%
浏览 4632
已采纳

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 2014-10-23 06: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吧。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料