String 、 StringBuffer、StringBuilder三者的区别

1、String类表示内容不可修改的字符串,StringBuffer(线程安全)和StringBuilder(线程不安全)类都表示内容可以被修改的字符串。

2、执行速度:StringBuilder > StringBuffer > String

String执行速度最慢原因:

  String的底层代码为一个用final修饰的char数组,这意味着定义一个String变量后,该变量的内容是不能够改变的。

  也就是说,你定义一个String变量后,不断的改变其内容,表面上看起来是改变了内容,因为每次输出的内容的确是改变了。但是,实际上是在不断地创建了新的String对象,而变量不断地指向新的String对象,所以看起来是改变了String对象的内容。

例如:

1 String s= "string1";
2 s = s+"strign2";

  这两行代码执行后,原始的String对象中的内容没有改变。s原先指向内容是"string1"的String对象,执行了第二句后,这时s不再指向原来的那个对象,而指向了另一个内容是"string1 string2"的对象,原来的那个对象还存在内存中,只是s不在指向它了。所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

 1      String string = new String();
 2         
 3         StringBuffer sBuffer = new StringBuffer();
 4         //开始时间
 5         long startTime;
 6         //结束时间
 7         long endTime;
 8         
 9         startTime = System.currentTimeMillis();
10         
11         for (int i=0;i<10000;i++) {
12             string += i;
13         }
14         endTime = System.currentTimeMillis();
15         System.out.println("String执行时间:"+(endTime-startTime));
16         
17         startTime = System.currentTimeMillis();
18         
19         for (int i=0;i<10000;i++) {
20             sBuffer.append(i);
21         }
22         endTime = System.currentTimeMillis();
23         System.out.println("StringBuffer执行时间:"+(endTime-startTime));

执行结果:

1 String执行时间:329
2 StringBuffer执行时间:2

StringBuffer和StringBuilder

  StringBuilder是线程不安全的,所以运行效率高。如果一个字符串是在方法里定义,这种情况下只可能有一个线程访问,不存在不安全的因素,所以可以用StringBuilder。如果要在类里定义成员变量,并且这个类的实例对象会在多线程环境下使用,最好使用StringBuffer。

猜你喜欢

转载自www.cnblogs.com/xiaocaiyu/p/10812541.html