首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >声纳抱怨:使用StringBuilder而不是StringBuffer

声纳抱怨:使用StringBuilder而不是StringBuffer
EN

Stack Overflow用户
提问于 2016-08-10 15:21:32
回答 1查看 4K关注 0票数 2

我目前正在做一段代码,它必须能够匹配一些regexp,并在字符串中做一些与regexp匹配的替换。

为了做到这一点,我在java中使用了匹配器对象。但是,正如您在互联网上看到的那样,所有示例都使用StringBuffer,以便使用附录替换和附录方法(oracleDoc)进行一些替换。

但是当我推送我的代码时,Sonar抱怨说我使用了字符串缓冲区而不是字符串构建器。

  • 来自声纳的警告在这种情况下是一个错误吗?
  • 是否有使用字符串生成器进行同样操作的库?

显然,有些开发人员抱怨那个这里

我找到了一种不使用StringBuffer和StringBuilder的方法,但我确信这并不像使用StringBuffer那样有效(而且可能是一种糟糕的实践)。您可以在junit中复制粘贴,测试下面的示例代码:

代码语言:javascript
复制
    String entry = "Actual 4.11-6 and 13-5";
    String expectedReturn = "Actual 4*11^(-6) and 13^(-5)";

    String number = "(^|\\s)-?\\d+((\\.||,)\\d+){0,1}(.\\d+){0,1}-\\d+";
    Pattern pattern = Pattern.compile(number);
    Matcher matcher = pattern.matcher(entry);

    //USING STRING BUFFER
    StringBuffer stringBuffer = new StringBuffer();
    String substring;
    while(matcher.find()){
        substring = matcher.group(0);
        matcher.appendReplacement(stringBuffer,substring.replace(".","*").replace("-","^(-")+")");
    }
    matcher.appendTail(stringBuffer);

    //USING STRING BUILDER
    matcher = pattern.matcher(entry);
    int lastIndex = 0;
    StringBuilder stringBuilder = new StringBuilder();
    while(matcher.find()){
        stringBuilder.append(entry.substring(lastIndex,matcher.start()));
        substring = matcher.group(0);
        stringBuilder.append(substring.replace(".","*").replace("-","^(-")+")");
        lastIndex = matcher.end();
    }
    stringBuilder.append(entry.substring(lastIndex,entry.length()));

    Assert.assertEquals(expectedReturn,stringBuffer.toString());
    Assert.assertEquals(expectedReturn,stringBuilder.toString());

信息:管理用于追加的字符串生成器的匹配器将在jdk 9 源代码代码评审中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-10 15:33:39

这是警告,不是错误。声纳做了它的工作警告你,StringBuilder是更好的因为它更快。如果API强制您使用StringBuffer,那么我将使用它并沉默警告。

我认为Pattern和两个缓冲区的真正根本问题是,StringBufferStringBuilder没有共享用于构建字符串的特定接口(Appendable是一个更通用的接口,我认为它们应该共享一个更特定的接口,用于构造字符串,比如StringConstructor),这将允许您以零工作(通常)来切换实现。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38877546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档