【问题标题】:String vs StringBuilder字符串与字符串生成器
【发布时间】:2021-07-30 06:32:38
【问题描述】:

我有这样的情况:

public String createId(List<String> list)
{
String id="";
if(list.contains("name"))
id+="TEST VALUE NAME";
if(list.contains("age"))
id+="Test Value AGE";
.
.
. likewise many if condition
return id;
}

根据我的理解,我们应该在循环条件中使用 StringBuilder,在简单连接中使用 String。所以这里想问我应该用String还是StringBuilder?请推荐

【问题讨论】:

  • StringBuilder 是首选
  • 您可以通过缩进来格式化您的代码。
  • 假设这些if 语句有大量,StringBuilder 会更好,但是,您还应该关注这些重复的线性搜索。
  • 即使StringBuilderString += 更受欢迎,.containsList 和这里代码的一般结构很可能比StringBuilder vs 产生更大的影响String。例如,如果您的所有条件都像这样(列表中的每个值都映射到结果字符串中的一个值),您可以在列表中循环一次,添加一个switch-case 并在该循环中使用StringBuilder 连接.或使用Set。在 List 上对 contains 的每次调用都必须遍历所有元素,直到找到查询的值。再说一次,不要做过早的优化。

标签: java arrays spring oop java-8


【解决方案1】:

StringBuilder 最适合这种情况,因为它是可变的。 String 是不可变的,因此当您修改字符串时,它会创建一个新对象。

【讨论】:

  • 不一定。根据Java Language Specification,“为了提高重复字符串连接的性能,Java 编译器可以使用 StringBuffer 类或类似技术来减少通过评估表达式创建的中间字符串对象的数量。”
【解决方案2】:

一般而言,您对何时使用String 连接与StringBuilder 的理解是正确的。 Java Language Specification

为了提高重复字符串连接的性能,Java 编译器可以使用 StringBuffer 类或类似的技术 减少创建的中间字符串对象的数量 表达式的评估。

在大多数情况下,您应该使用能够提高可读性和可维护性的任何方法。

【讨论】:

    【解决方案3】:

    似乎对于给定的任务,最好通过定义一个 list 键来匹配输入列表并使用 Stream API 生成来摆脱多个重复的 if 语句字符串 id,例如Collectors.joiningwith delimiterwithout the delimiter

    假设有一个规则来创建id的一部分:append "Test Value " + key.toUpperCase(),实现可能如下所示:

    final List<String> keys = Arrays.asList(
        "name", "age" /* and other needed keys*/
    );
    
    public String createId(List<String> list) {
        return keys
                .stream()
                .filter(list::contains)
                .map(String::toUpperCase)
                .map(str -> "Test Value " + str)
                .collect(Collectors.joining("_")); // or Collectors.joining()
    }
    
    System.out.println(createId(Arrays.asList("age", "name", "surname")));
    // output: Test Value NAME_Test Value AGE
    

    如果应为nameage 等提供自定义部分,则应准备和使用匹配的Map,也可以将输入list 转换为Set&lt;String 为方便查找:

    final Map<String, String> keys = new LinkedHashMap<>(); {
        // fill the map in special order
        keys.put("name", "Name Part");
        keys.put("age", "Test Age");
        /* and other needed keys*/
    }
    
    public String createId(List<String> list) {
        Set<String> words = new HashSet<>(list);
        return keys.keySet()
                .stream()
                .filter(words::contains) // faster lookup O(1) at the cost of another collection
                .map(keys::get)
                .collect(Collectors.joining("_")); // or Collectors.joining()
    }
    
    System.out.println(createId(Arrays.asList("age", "surname", "name")));
    // output: Name Part_Test Age
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-29
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2015-07-14
      相关资源
      最近更新 更多