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。
原文地址:https://www.cnblogs.com/xiaocaiyu/p/10812541.html