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条)

报告相同问题?

悬赏问题

  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元