String StringBufferStringBuilder三者的区别
Posted xiaocaiyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String StringBufferStringBuilder三者的区别相关的知识,希望对你有一定的参考价值。
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。
以上是关于String StringBufferStringBuilder三者的区别的主要内容,如果未能解决你的问题,请参考以下文章
“字符串”类型的参数不可分配给“$string”类型的参数 | `$string.$string` | `$string.$number`'
Activity 类型的方法 managedQuery(Uri, String[], String, String[], String) 已弃用