在Java中,字符串的拼接有多种操作,目前我常用是两种:
- + 运算符
- StringBuilder
目前在学习的过程中,首先被提到的就是在字符串的拼接操作中,不可以针对大量的字符串改动操作使用“+”来运行,而是应该使用StringBuilder类中的方法,那么这是为什么呢?
1 public class ArrTest { 2 public static void main(String[] args) { 3 String string = ""; 4 long begin1 = System.currentTimeMillis(); 5 for(int i = 0; i<100000; i++) { 6 string += 1; 7 } 8 long end1 = System.currentTimeMillis(); 9 10 StringBuilder sb = new StringBuilder(); 11 long begin2 = System.currentTimeMillis(); 12 for(int i = 0; i<100000; i++) { 13 sb.append(1); 14 } 15 long end2 = System.currentTimeMillis(); 16 17 18 System.out.println("String的运行时间是"+(end1-begin1)); 19 System.out.println("StringBuilder的运行时间是"+(end2-begin2)); 20 } 21 }
以上代码是一个简单的测试代码,测试得知,在相同条件下,小规模的改动对于二者来说运行时间并无区别,
但是一旦涉及的改动操作容量较大时,那么String类的 + 运算的运行时间就会大大减缓,而对于StringBuilder来说,运行时间相较String的+运算来说,变化微乎其微
通过查询底层发现,Java使用 + 进行字符串拼接操作时,底层实现依然还是使用的 StringBuilder 进行实现,每进行一次拼接操作就会创建一个新的 StringBuilder 对象
这样进行操作的话,是会带来很大的性能损耗,因此在少量操作时运行时间的改变不明显,一旦涉及到大量改动操作,那么运行时间就会肉眼可见的减慢
而通过查询StringBuilder的底层发现,StringBuilder的append操作不涉及StringBuilder对象的创建,在拼接时只涉及到自身,因此效率较高
在进行字符串拼接时需要注意,字符串本身并不可变,我们可以通过新建字符串然后以重新指向的方式拼接字符串