在实际开发过程中,经常涉及到字符串的处理,特别是字符串的连接。常规情况下,我们都习惯了直接使用“+”来连接两个字符串,方便简洁,但又总会有人告诉你,使用“+”连接字符串是一种低效的处理方式。由于“+”不是一个特定的类,无法从jdk源码去一探究竟底层如何实现的,所以,唯一的解释就是编译器动了手脚。
L0 LINENUMBER 27 L0 ACONST_NULL ASTORE 1 L1 LINENUMBER 28 L1 NEW java/lang/StringBuilder DUP INVOKESPECIAL java/lang/StringBuilder.<init> ()V ALOAD 1 INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; LDC "!" INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String; ASTORE 1 L2 LINENUMBER 29 L2 GETSTATIC java/lang/System.out : Ljava/io/PrintStream; ALOAD 1 INVOKEVIRTUAL java/io/PrintStream.print (Ljava/lang/String;)V从字节码我们能够清楚的看到“java/lang/StringBuilder.append”字样,原来如此,字符串使用“+”拼接时,底层仍然是通过StringBuilder来实现的。当两个字符串通过“+”连接时,先初始化一个StringBuilder对象,然后按顺序调用append方法来连接,最后通过toString方法返回拼接后的字符串。n个“+”号,这样的操作就会重复n次,很明显造成了没必要的消耗。
特别地,在进行sql拼接的时候,频繁的通过“+”来拼接较大的String对象,内存瞬时消耗较高,此时建议直接用StringBuilder.append("...")来拼接多个子串,并且在StringBuilder对象使用完毕后,通过delete(0,StringBuilder.length())来释放内存。
