StringUtils.repeat函数赏析与疑问

博客围绕字符串重复操作展开,对参数校验时repeat为0返回empty而非原字符串提出疑问,还探讨了单个字符repeat时与PAD_LIMIT(8192)的关系判断,分析了一个字符和两个字符重复时的处理逻辑,如构建char数组、循环次数等,最后提到使用StringBuffer。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     今天实现一个字符串拼接的一个需求,比如:
      
输入:
 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,这点和我想到的一致
 
 最后总结下,看这些程序确实能提高自己的认知和考虑问题的周到性。
 
<think>我们正在讨论ApacheCommonsLang库中的StringUtils类,具体方法包括left,right,repeat以及它们的组合使用。首先,需要明确这些方法的基本用法,然后给出组合使用的示例。1.StringUtils.left:返回字符串左侧指定长度的子串。语法:StringUtils.left(Stringstr,intlen)如果len超过字符串长度,则返回原字符串;如果len为负数,则返回空字符串。2.StringUtils.right:返回字符串右侧指定长度的子串。语法:StringUtils.right(Stringstr,intlen)同样,如果len超过字符串长度,返回原字符串;负数则返回空字符串。3.StringUtils.repeat:将字符串重复指定次数。语法:StringUtils.repeat(Stringstr,intrepeat)如果重复次数为0或负数,返回空字符串。组合功能示例:我们可以组合这些方法来实现一些常见的字符串操作。下面用示例代码解释:</think> ### StringUtils常用方法详解 `StringUtils`(Apache Commons Lang库)提供高效字符串操作,避免空指针异常。以下是核心方法及组合应用: --- #### 1. `StringUtils.left()` **功能**:截取字符串**左侧**指定长度字符。 **语法**:`StringUtils.left(String str, int len)` **规则**: - `len=0` → 返回空字符串 `""` - `len>str.length()` → 返回完整原字符串 - `str=null` → 返回 `null`(安全处理) **示例**: ```java StringUtils.left("Hello", 3); // 输出 "Hel" StringUtils.left("Hi", 5); // 输出 "Hi"(长度不足时保留全部) StringUtils.left(null, 2); // 输出 null(非空指针) ``` --- #### 2. `StringUtils.right()` **功能**:截取字符串**右侧**指定长度字符。 **语法**:`StringUtils.right(String str, int len)` **规则**:`.left()`类似,方向相反。 **示例**: ```java StringUtils.right("World", 3); // 输出 "rld" StringUtils.right("OK", 4); // 输出 "OK"(保留全部) ``` --- #### 3. `StringUtils.repeat()` **功能**:重复字符串指定次数。 **语法**:`StringUtils.repeat(String str, int repeatTimes)` **规则**: - `repeatTimes<=0` → 返回空字符串 `""` - `str=null` → 返回 `null` **示例**: ```java StringUtils.repeat("A", 3); // 输出 "AAA" StringUtils.repeat("-*", 2); // 输出 "-*-*" ``` --- ### 组合功能示例 **场景**:生成带固定前缀/后缀的定长填充字符串。 **代码**: ```java // 组合:前缀截取 + 重复填充 + 后缀截取 public String formatId(String prefix, String suffix, int totalLen) { String leftPart = StringUtils.left(prefix, 2); // 取前缀前2位 String fill = StringUtils.repeat("0", totalLen - 4); // 生成填充0 String rightPart = StringUtils.right(suffix, 2); // 取后缀后2位 return leftPart + fill + rightPart; // 组合结果 } ``` **调用示例**: ```java formatId("AB12", "CD34", 8); // 输出 "AB0000CD" // 逻辑分解: // 1. left("AB12",2) → "AB" // 2. repeat("0", 8-4=4) → "0000" // 3. right("CD34",2) → "CD" ``` --- ### 关键优势 1. **空安全**:自动处理 `null` 输入,避免崩溃[^1]。 2. **边界保护**:长度超限时返回合理值(非异常)。 3. **链式组合**:支持灵活拼接复杂字符串逻辑。 --- #### **相关问题** 1. `StringUtils` 如何其他字符串工具类(如`Guava`)对比? 2. 在多线程环境下使用`StringUtils`是否安全? 3. 如何用`StringUtils`实现字符串加密遮盖(如手机号`138****1234`)? [^1]: Apache Commons Lang官方文档强调空安全设计原则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值