首页 > 编程语言 >java 字符串拼接

java 字符串拼接

时间:2022-11-21 17:00:00浏览次数:66  
标签:java String StringBuilder 拼接 StringBuffer 字符串 concat

最常用的有4种方法

  1. +运算符:如果拼接的都是字符串直接量,则适合使用 + 运算符实现拼接;
 public static void main(String[] args) {
	 method1();
 }

// 字符串拼接:+
public static void method1(){
	String a = "我是";
	String b = "fzg";
	String res = a + b;
	log.info(res);
}

image

  1. 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());
    }

image

  1. StringBuffer:如果拼接的字符串中包含变量,并且要求线程安全,则适合使用StringBuffer;
    // 字符串拼接:StringBuffer
    public static void method3(){
        String a = "我是";
        StringBuffer stringBuffer = new StringBuffer(a);
        stringBuffer.append("男生");
        log.info(stringBuffer.toString());
    }

image

  1. 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);
    }

image

扩展

  1. StringBuffer和StringBuilder有什么区别

StringBuffer、StringBuilder都代表可变的字符串对象,它们有共同的父类 AbstractStringBuilder,并且两个类的构造方法和成员方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder是非线程安全的,所以StringBuilder性能略高。一般情况下,要创建一个内容可变的字符串,建议优先考虑StringBuilder类。

  1. 使用字符串时,new和""推荐使用哪种方式?

先看看 "hello" 和 new String("hello") 的区别:

当Java程序直接使用 "hello" 的字符串直接量时,JVM将会使用常量池来管理这个字符串;

当使用 new String("hello") 时,JVM会先使用常量池来管理 "hello" 直接量,再调用String类的构造器来创建一个新的String对象,新创建的String对象被保存在堆内存中。

显然,采用new的方式会多创建一个对象出来,会占用更多的内存,所以一般建议使用直接量的方式创建字符串。

  1. 四种方法的效率

采用 + 运算符拼接字符串时:
如果拼接的都是字符串直接量,则在编译时编译器会将其直接优化为一个完整的字符串,和你直接写一个完整的字符串是一样的,所以效率非常的高。

如果拼接的字符串中包含变量,则在编译时编译器采用StringBuilder对其进行优化,即自动创建StringBuilder实例并调用其append()方法,将这些字符串拼接在一起,效率也很高。但如果这个拼接操作是在循环中进行的,那么每次循环编译器都会创建一个StringBuilder实例,再去拼接字符串,相当于执行了 new StringBuilder().append(str),所以此时效率很低。

采用StringBuilder/StringBuffer拼接字符串时:

StringBuilder/StringBuffer都有字符串缓冲区,缓冲区的容量在创建对象时确定,并且默认为16。当拼接的字符串超过缓冲区的容量时,会触发缓冲区的扩容机制,即缓冲区加倍。

缓冲区频繁的扩容会降低拼接的性能,所以如果能提前预估最终字符串的长度,则建议在创建可变字符串对象时,放弃使用默认的容量,可以指定缓冲区的容量为预估的字符串的长度。

采用String类的concat方法拼接字符串时:

concat方法的拼接逻辑是,先创建一个足以容纳待拼接的两个字符串的字节数组,然后先后将两个字符串拼到这个数组里,最后将此数组转换为字符串。

在拼接大量字符串的时候,concat方法的效率低于StringBuilder。但是只拼接2个字符串时,concat方法的效率要优于StringBuilder。并且这种拼接方式代码简洁,所以只拼2个字符串时建议优先选择concat方法。

  1. String a = "abc"; ,说一下这个过程会创建什么,放在哪里?

JVM会使用常量池来管理字符串直接量。在执行这句话时,JVM会先检查常量池中是否已经存有"abc",若没有则将"abc"存入常量池,否则就复用常量池中已有的"abc",将其引用赋值给变量a。

  1. new String("abc") 是去了哪里,仅仅是在堆里面吗?

在执行这句话时,JVM会先使用常量池来管理字符串直接量,即将"abc"存入常量池。然后再创建一个新的String对象,这个对象会被保存在堆内存中。并且,堆中对象的数据会指向常量池中的直接量。

详情请看:
https://www.nowcoder.com/tutorial/94/0f490fc65e3143188ca34029860b8efc

标签:java,String,StringBuilder,拼接,StringBuffer,字符串,concat
From: https://www.cnblogs.com/Fantasyfzg/p/16911882.html

相关文章