A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邱成 中级黑马   /  2012-9-22 22:04  /  1334 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 邱成 于 2012-9-24 22:39 编辑

import java.util.*;
public class S{
    public static void main(String[] args){
        String s = "boo:and:foo";
        System.out.println(Arrays.toString(s.split("o",-1)));
    }
}
输出结果为:"b", "", ":and:f", "", ""
为什么b后面两个o,只有一个空字符串,而f后面两个o确有两个空字符串的输出!是不是split在字符串结尾匹配的时候又做了什么?

2 个回复

倒序浏览
在eclipse中使用F3查看源码
  1.     // Pattern.class中发现下面代码,input="boo:and:foo"; limit=-1
  2.     public String[] split(CharSequence input, int limit) {
  3.         int index = 0;
  4.         boolean matchLimited = limit > 0;
  5.         ArrayList<String> matchList = new ArrayList<String>();
  6.         Matcher m = matcher(input);

  7.         // Add segments before each match found
  8.         while(m.find()) {
  9.             if (!matchLimited || matchList.size() < limit - 1) {
  10.                 String match = input.subSequence(index, m.start()).toString();
  11.                 matchList.add(match);
  12.                 index = m.end();
  13.             } else if (matchList.size() == limit - 1) { // last one
  14.                 String match = input.subSequence(index,
  15.                                                  input.length()).toString();
  16.                 matchList.add(match);
  17.                 index = m.end();
  18.             }
  19.         }

  20.         // If no match was found, return this
  21.         if (index == 0)
  22.             return new String[] {input.toString()};

  23.         // Add remaining segment; 注意这句,虽然此时index=input.length()但是,条件依然成立
  24.         // 所以就会出现后面多一个空字符串的现象
  25.         if (!matchLimited || matchList.size() < limit)
  26.             matchList.add(input.subSequence(index, input.length()).toString());

  27.         // Construct result
  28.         int resultSize = matchList.size();
  29.         if (limit == 0)
  30.             while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
  31.                 resultSize--;
  32.         String[] result = new String[resultSize];
  33.         return matchList.subList(0, resultSize).toArray(result);
  34.     }
复制代码
回复 使用道具 举报
import java.util.*;
public class S{
    public static void main(String[] args){
        String s = "boo:and:foo";
        System.out.println(Arrays.toString(s.split("o",-1)));
    }
}


关于你这个问题,我经过了多次的验证得到了一下的结论:
当调用字符串的split方法时候,在字符串中"boo:and:foo";
如果,只有一个满足条件的会直接会从其中切开,如果有连续满足的就如你切oo,虚拟机就会根据连续满足条件的字符的位置不同而进行相应的切割
如果连续满足条件的在字符串的开始或者结尾处,他就会将满足条件的所有字符全部都切走,并且赋值其元素为null,有几个满足条件的就会留几个null.
如果连续满足条件的在字符串中,java虚拟机就会切走一个,将剩下的赋值为null。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马