java 字符串与StringBuilder

lstz6jyr  于 2023-03-06  发布在  Java
关注(0)|答案(4)|浏览(138)

我有这样的情况:

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***?请建议

u5rb5r59

u5rb5r591#

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

au9on6nz

au9on6nz2#

对于给定任务,似乎最好通过定义键的 list 以匹配输入列表并使用Stream API生成字符串id(例如,带分隔符或不带分隔符的Collectors.joining)来去除多个重复的if语句。
假设有一个规则来创建id的一部分:附加"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<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
uelo1irk

uelo1irk3#

一般来说,您对何时使用String连接和何时使用StringBuilder连接的理解是正确的。
为了提高重复字符串连接的性能,Java编译器可以使用StringBuffer类或类似的技术来减少通过表达式求值创建的中间String对象的数量。
对于大多数情况,您应该使用可读性和可维护性更好的方法。

brvekthn

brvekthn4#

如前所述,StringBuilder是不可变的,而String不是。
此外,当编译器编译字符串连接时,它会将其转换为StringBuilder.String concatenation in toString in Java
另外要记住的是,如果使用Sonar或其他工具进行代码分析,id+="TEST VALUE NAME";会增加复杂性。
使用StringBuilder不会增加分析工具的复杂性。

相关问题