String vs StringBuilder



我有一个条件:

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;
}

根据我的理解,我们应该使用StringBuilderString以简单的连接方式。这里我想问我应该使用String还是StringBuilder?请建议

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

似乎对于给定的任务,最好通过定义一个列表键来匹配输入列表,并使用流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

如果要为name,age等提供定制部件,则应准备并使用匹配的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

一般来说,您对何时使用String串联与StringBuilder串联的理解是正确的。Java语言规范说

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

对于大多数情况,您应该使用具有更好的可读性和可维护性的方法。

如前所述StringBuilderString不是。

要添加到此,当编译器编译字符串连接时,它将其转换为StringBuilder。Java中toString中的字符串连接

另外要记住的是,如果你用Sonar或其他工具进行代码分析,id+="TEST VALUE NAME";会增加复杂性。

使用StringBuilder不会增加分析工具的复杂性。

最新更新