跳至主要內容

String字符串的拼接

向往大约 1 分钟java

概述

常见的字符串拼接可以通过+StringBuilderStringBuffer实现字符串的拼接。

实现

使用+实现字符串拼接

代码如下:

public class StringSpliceTest {
    public static void main(String[] args) {
        String s = "aaaa" + "bbbbbbb";
        User user = new User("1111111111111");
        String aa = "fffff" + user.getName();
    }

    public static class User{
        private String name;

        public User(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

使用javac命令进行编译后得到的class文件如下图右边所示:

image-20221214142716176

如上图绿色标记所示,当使用+对字符串进行连接时,会创建一个临时的StringBuilder对象,该对象调用append方法负责字符串的连接操作,然后再调用StringBuilder类的toString方法转换成String对象。但是红色标记部分却没有创建StringBuilder对象,这是因为当使用运算符“+”连接字符串时,如果两个操作数都是编译时常量,则在编译时期就会计算出该字符串的值,而不会在运行的时候创建StringBuilder对象。

性能优化

如果是在循环中对String对象进行连接,应该直接使用StringBuilder代替String的+连接,这样可以提高性能 。

StringBuilder

代码如下:

 StringBuilder stringBuilder = new StringBuilder();
 stringBuilder.append("a").append("b").append("c");
 System.out.println(stringBuilder.toString());

默认内部维护了一个大小为16的char数组,当append内容的长度总和超过该值时,会进行扩容操作,底层通过System.arraycopy实现数组的复制,如果知道拼接的长度,最好初始化的时候手动指定大小。

StringBuffer

StringBufferStringBuilder使用方法类似,区别就是StringBuffer内部使用synchronized来保证多线程环境下线程安全。