最常用的有4种方法
- +运算符:如果拼接的都是字符串直接量,则适合使用 + 运算符实现拼接;
public static void main(String[] args) {
method1();
}
// 字符串拼接:+
public static void method1(){
String a = "我是";
String b = "fzg";
String res = a + b;
log.info(res);
}
- StringBuilder:如果拼接的字符串中包含变量,并不要求线程安全,则适合使用StringBuilder;
// 字符串拼接:StringBuilder
public static void method2(){
String a = "我有";
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(a);
int age = 23;
stringBuilder.append(age).append("岁了。");
log.info(stringBuilder.toString());
}
- StringBuffer:如果拼接的字符串中包含变量,并且要求线程安全,则适合使用StringBuffer;
// 字符串拼接:StringBuffer
public static void method3(){
String a = "我是";
StringBuffer stringBuffer = new StringBuffer(a);
stringBuffer.append("男生");
log.info(stringBuffer.toString());
}
- String类的concat方法:如果只是对两个字符串进行拼接,并且包含变量,则适合使用concat方法;
// 字符串拼接: string类的concat方法
public static void method4(){
String a = "今天是";
String time = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
String weather = " 天气晴。";
String res = a.concat(time).concat(weather);
log.info(res);
}
扩展
- StringBuffer和StringBuilder有什么区别
StringBuffer、StringBuilder都代表可变的字符串对象,它们有共同的父类 AbstractStringBuilder,并且两个类的构造方法和成员方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder是非线程安全的,所以StringBuilder性能略高。一般情况下,要创建一个内容可变的字符串,建议优先考虑StringBuilder类。
- 使用字符串时,new和""推荐使用哪种方式?
先看看 "hello" 和 new String("hello") 的区别:
当Java程序直接使用 "hello" 的字符串直接量时,JVM将会使用常量池来管理这个字符串;
当使用 new String("hello") 时,JVM会先使用常量池来管理 "hello" 直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。
显然,采用new的方式会多创建一个对象出来,会占用更多的内存,所以一般建议使用直接量的方式创建字符串。
- 四种方法的效率
采用 + 运算符拼接字符串时:
如果拼接的都是字符串直接量,则在编译时编译器会将其直接优化为一个完整的字符串,和你直接写一个完整的字符串是一样的,所以效率非常的高。
如果拼接的字符串中包含变量,则在编译时编译器采用StringBuilder对其进行优化,即自动创建StringBuilder实例并调用其append()方法,将这些字符串拼接在一起,效率也很高。但如果这个拼接操作是在循环中进行的,那么每次循环编译器都会创建一个StringBuilder实例,再去拼接字符串,相当于执行了 new StringBuilder().append(str),所以此时效率很低。
采用StringBuilder/StringBuffer拼接字符串时:
StringBuilder/StringBuffer都有字符串缓冲区,缓冲区的容量在创建对象时确定,并且默认为16。当拼接的字符串超过缓冲区的容量时,会触发缓冲区的扩容机制,即缓冲区加倍。
缓冲区频繁的扩容会降低拼接的性能,所以如果能提前预估最终字符串的长度,则建议在创建可变字符串对象时,放弃使用默认的容量,可以指定缓冲区的容量为预估的字符串的长度。
采用String类的concat方法拼接字符串时:
concat方法的拼接逻辑是,先创建一个足以容纳待拼接的两个字符串的字节数组,然后先后将两个字符串拼到这个数组里,最后将此数组转换为字符串。
在拼接大量字符串的时候,concat方法的效率低于StringBuilder。但是只拼接2个字符串时,concat方法的效率要优于StringBuilder。并且这种拼接方式代码简洁,所以只拼2个字符串时建议优先选择concat方法。
- String a = "abc"; ,说一下这个过程会创建什么,放在哪里?
JVM会使用常量池来管理字符串直接量。在执行这句话时,JVM会先检查常量池中是否已经存有"abc",若没有则将"abc"存入常量池,否则就复用常量池中已有的"abc",将其引用赋值给变量a。
- new String("abc") 是去了哪里,仅仅是在堆里面吗?
在执行这句话时,JVM会先使用常量池来管理字符串直接量,即将"abc"存入常量池。然后再创建一个新的String对象,这个对象会被保存在堆内存中。并且,堆中对象的数据会指向常量池中的直接量。
标签:java,String,StringBuilder,拼接,StringBuffer,字符串,concat From: https://www.cnblogs.com/Fantasyfzg/p/16911882.html详情请看:
https://www.nowcoder.com/tutorial/94/0f490fc65e3143188ca34029860b8efc