📫 作者简介:「子非我鱼」,专注于研究全栈
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~
文章目录
引言
在Java中,字符串拼接是一种常见的操作,有多种方法可以实现。在处理字符串拼接时,我们通常考虑性能、可读性和代码简洁性等因素。以下是一些常用的Java字符串拼接方式:
方式一:使用 + 操作符
“+”,是java操作运算符比较常用的,也是简单直接的一种方式。
String aa = "魅言倾馨";
String bb = "子非我鱼";
System.out.println(aa+bb);
方式二:使用StringBuilder.append()和StringBuffer.append()
先有StringBuffer后有StringBuilder,两者就像是孪生双胞胎,该有的都有,只不过大哥StringBuffer,大部分方法都经过synchronized修饰,所以StringBuffer是线程安全的,但是它效率就相对StringBuilder较低
String aa = "魅言倾馨";
String bb = "子非我鱼";
StringBuilder sber = new StringBuilder();
StringBuffer sbf = new StringBuffer();
sber.append(aa).append(bb);
System.out.println(sber.toString());
sbf.append(aa).append(bb);
System.out.println(sbf.toString());
方式三:使用String类下的cocat()方法
如果拼接的字符串是null,concat会抛出NullPointerException。如果拼接的字符串是一个空字符串(“”),那么concat的效率要更高。如果拼接的字符串非常多,concat的效率就会下降,因为创建的字符串对象越多,开销越大。
String aa = "魅言倾馨";
String bb = "子非我鱼";
String concat = aa.concat(bb);
System.out.println(concat);
方式四:使用String类下的join()方法
JDK1.8提供了一种新的字符串拼接姿势:String类增加了一个静态方法join,第一个参数为字符串连接符
String aa = "魅言倾馨";
String bb = "子非我鱼";
String join = String.join("-", aa, bb);
System.out.println(join);
方式五:使用StringJoiner
StringJoiner是JDK1.8,java.util包中的一个类,用于构造一个由分隔符重新连接的字符序列
String aa = "魅言倾馨";
String bb = "子非我鱼";
StringJoiner sj = new StringJoiner(":", "[", "]");
sj.add(aa).add(bb);
System.out.println(sj.toString());
StringJoiner源码
package java.util;
public final class StringJoiner {
private final String prefix;//前缀
private final String delimiter;//间隔符
private final String suffix;//后缀
private StringBuilder value;//值
private String emptyValue;//空值
public StringJoiner(CharSequence delimiter) {
this(delimiter, "", "");//默认前缀和后缀为"",重载调用
}
public StringJoiner(CharSequence delimiter,
CharSequence prefix,
CharSequence suffix) {
//间隔符,前缀和后缀判断是否为null,null将抛出异常
Objects.requireNonNull(prefix, "The prefix must not be null");
Objects.requireNonNull(delimiter, "The delimiter must not be null");
Objects.requireNonNull(suffix, "The suffix must not be null");
// 成员变量赋值
this.prefix = prefix.toString();
this.delimiter = delimiter.toString();
this.suffix = suffix.toString();
this.emptyValue = this.prefix + this.suffix;//空值被设置为只有前后缀
}
//设置空值,检查是否为null
public StringJoiner setEmptyValue(CharSequence emptyValue) {
this.emptyValue = Objects.requireNonNull(emptyValue,
"The empty value must not be null").toString();
return this;
}
@Override
public String toString() {
if (value == null) {
return emptyValue;//没有值将返回空值或者后续设置的空值
} else {
if (suffix.equals("")) {
return value.toString();//后缀为""直接返回字符串,不用添加
} else {
//后缀不为"",添加后缀,然后直接返回字符串,修改长度
int initialLength = value.length();
String result = value.append(suffix).toString();
// reset value to pre-append initialLength
value.setLength(initialLength);
return result;
}
}
}
初始化,先添加前缀,有了之后每次先添加间隔符,StringBuilder后续append字符串
public StringJoiner add(CharSequence newElement) {
prepareBuilder().append(newElement);
return this;
}
//合并StringJoiner,注意后面StringJoiner 的前缀就不要了,后面的appen进来
public StringJoiner merge(StringJoiner other) {
Objects.requireNonNull(other);
if (other.value != null) {
final int length = other.value.length();
// lock the length so that we can seize the data to be appended
// before initiate copying to avoid interference, especially when
// merge 'this'
StringBuilder builder = prepareBuilder();
builder.append(other.value, other.prefix.length(), length);
}
return this;
}
//初始化,先添加前缀,有了之后每次先添加间隔符
private StringBuilder prepareBuilder() {
if (value != null) {
value.append(delimiter);
} else {
value = new StringBuilder().append(prefix);
}
return value;
}
public int length() {
// Remember that we never actually append the suffix unless we return
// the full (present) value or some sub-string or length of it, so that
// we can add on more if we need to.
//不忘添加后缀的长度
return (value != null ? value.length() + suffix.length() :
emptyValue.length());
}
}
方式六:使用StringUtils.join()
实战项目中,我们处理字符串的时候,经常会用到这个类.org.apache.commons.lang3.StringUtils包下,该方法更善于拼接数组中的字符串,并且不用担心 NullPointerException。
String aa = "魅言倾馨";
String bb = "子非我鱼";
String ids[] = {"1","2","3"};
System.out.println(StringUtils.join(aa,bb));
String join1 = StringUtils.join(ids,",");
System.out.println(join1);
总结
在选择字符串拼接方式时,应根据具体场景和需求进行权衡。对于大规模的拼接操作,StringBuilder 是一个性能良好的选择。对于简单的拼接,使用 + 操作符或 concat() 也是不错的选择。在Java 8及以上版本,String.join() 提供了更简洁的处理集合字符串的方式。总的来说,合理选择字符串拼接方式可以提高代码性能和可读性。