文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>一道腾讯java笔试题-稍不留神便出错,不信,你来试试

一道腾讯java笔试题-稍不留神便出错,不信,你来试试

时间:2010-04-03  来源:夏德虎

前日到腾讯进行了笔试,回想其中一道笔试选择题无太大把握.回来上机进行了验证,果然选错了.特在此记下,已便日后查阅.

试题如下:

"|DF|A".split("|").length的结果是()

A 2  B 3  C 5  D 6

我知道String的split方法极容易出错,然而想不到的是这道题的答案竟然是D.

分析:

这道题的关键是String.split方法的参数是一个正则表达式字符串,split实际上调用的是:

public String[] split(String regex, int limit) {
    return Pattern.compile(regex).split(this, limit);
    }




而"|"这里不是简单的'|'字符,查阅Pattern类API就会知道:

"|"是正则表达式里的逻辑或运算符,它被编译后匹配的是其左右两边的任意一个字符串.举个例子来说

        String[] arr = "a1b2cc1dd".split("1|2");//以1或者2分隔字符串
        
        System.out.println(arr.length);
        for(String s:arr){
            System.out.println(s);
        }

结果:
4
a
b
cc
dd

         //以空串或者空串分隔字符串,实际上是分隔每一个字符

        String[] arr = "a1b2cc1dd".split("|");
        
        System.out.println(arr.length);
        for(String s:arr){
            System.out.println(s);
        }

结果:
10

a
1
b
2
c
c
1
d
d
























这道题到这里已经知道为什么要选择D了,但对于String.split方法我觉得更容易出问题的还在以下一些例子,请读者自己查看源码查找答案:

"|DF|A|||".split("[|]").length = 3

"||DF|A|||".split("[|]").length = 4


//关键看Pattern类源码

public String[] split(CharSequence input, int limit) {
        int index = 0;
        boolean matchLimited = limit > 0;
        ArrayList matchList = new ArrayList();
        Matcher m = matcher(input);

        // Add segments before each match found

        while(m.find()) {
            if (!matchLimited || matchList.size() < limit - 1) {
                String match = input.subSequence(index, m.start()).toString();
                matchList.add(match);
                index = m.end();
            } else if (matchList.size() == limit - 1) { // last one

                String match = input.subSequence(index,
                                                 input.length()).toString();
                matchList.add(match);
                index = m.end();
            }
        }

        // If no match was found, return this

        if (index == 0)
            return new String[] {input.toString()};

        // Add remaining segment

        if (!matchLimited || matchList.size() < limit)
            matchList.add(input.subSequence(index, input.length()).toString());

        // Construct result

        int resultSize = matchList.size();
        if (limit == 0)

            //请看这里做了什么操作,分隔后的结果从最后开始遍历,凡是等于空串的一律截掉,否则退出
            while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
                resultSize--;
        String[] result = new String[resultSize];
        return (String[])matchList.subList(0, resultSize).toArray(result);
    }


相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载