当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

StringUtils.repeat函数赏析与疑问

发表于: 2014-09-01   作者:asialee   来源:转载   浏览次数:
摘要:       今天实现一个字符串拼接的一个需求,比如:        输入: int times = 3; String str = "abcd"; 输出: abcdabcdabcd          本身想自己用StringBu
     今天实现一个字符串拼接的一个需求,比如:
      
输入:
 int times = 3;
String str = "abcd";
输出:
abcdabcdabcd
    
    本身想自己用StringBuffer写的,后来稍微查了下,发现org.apache.commons.lang.StringUtils.repeat实现了,稍微看了下它的实现,感觉这个库的作者实现的比我们想象的严禁多了。
    下来我们看下:
   
 public static String repeat(String str, int repeat) {
        // Performance tuned for 2.0 (JDK1.4)

        if (str == null ) {
            return null ;
        }
        if (repeat <= 0) {
            return EMPTY ;
        }
        int inputLength = str.length();
        if (repeat == 1 || inputLength == 0) {
            return str;
        }
        if (inputLength == 1 && repeat <= PAD_LIMIT) {
            return padding(repeat, str.charAt(0));
        }

        int outputLength = inputLength * repeat;
        switch (inputLength) {
            case 1 :
                char ch = str.charAt(0);
                char [] output1 = new char[outputLength];
                for (int i = repeat - 1; i >= 0; i--) {
                    output1[i] = ch;
                }
                return new String(output1);
            case 2 :
                char ch0 = str.charAt(0);
                char ch1 = str.charAt(1);
                char [] output2 = new char[outputLength];
                for (int i = repeat * 2 - 2; i >= 0; i--, i--) {
                    output2[i] = ch0;
                    output2[i + 1] = ch1;
                }
                return new String(output2);
            default :
                StringBuffer buf = new StringBuffer(outputLength);
                for (int i = 0; i < repeat; i++) {
                    buf.append(str);
                }
                return buf.toString();
        }
    }
 
实现的亮点我来稍微总结下
  • 开头的时候就进行了参数的校验,这个里面我个人的感觉,如果repeat为0的时候,应该返回原字符串,为什么要返回empty?
  • 这个里面如果是单个字符repeat的话,会判断repeat次数和PAD_LIMIT的关系,PAD_LIMIT为8192,这个我就有点不大明白
  • 后面就进行了判断,如果是一个字符的话,构建char数组,这个比较好理解
  • 如果是两个字符的话,这个地方少循环了一次,我感觉我写程序的话,这块考虑不到
  • 最后使用StringBuffer,这点和我想到的一致
 
 最后总结下,看这些程序确实能提高自己的认知和考虑问题的周到性。
 

StringUtils.repeat函数赏析与疑问

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
国家/地区: 美国 类型: 惊悚 / 剧情 / 悬疑 片长: 138 min 分级: USA:R 对白语言: 英语 发行公
一转眼,用友2008年的年会又要在上海的东方明珠开始了。回顾中国软件发展的20年,是自主创新、不断
一转眼,用友2008年的年会又要在上海的东方明珠开始了。回顾中国软件发展的20年,是自主创新、不断
歌词赏析 “你的泪光 柔弱中带伤 惨白的月弯弯 勾住过往” 月弯弯:出自宋 无名氏的“月儿弯弯照九
这是一部很有趣也很感人的片子。片子中的小女孩以真诚感化了企图用自杀来解脱自己的骨伤演员。电影
封面: 前勒口,作者介绍: 封底,内容简介: 后勒口,本书后续: 合成图: 本书已经在CHINA-PUB开
作者:zccst Todo实例花了我两天多的事件,为了下次再忘记,决定记录下来: $(function(){ /********
8
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtm
ScriptManager.RegisterClientScriptBlock: MSDN中对这个方法的解释为: 向 ScriptManager 控件注册
#include <stdio.h> int main(){ int a[2][3]={1,2,3,4,5,6}; int (*p)[3]; int i,j; p=a; sc
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号