,,全面解释java中StringBuilder、StringBuffer、String类之间的关系

,,全面解释java中StringBuilder、StringBuffer、String类之间的关系

String的值是不可变的,导致每次操作String都要生成一个新的String对象,不仅效率低,而且浪费了大量有限的内存空间。StringBuffer是一个可变类,也是一个线程安全的字符串操作类,对它所指向的字符串的任何操作都不会生成新的对象。StringBuilder和StringBuffer的功能基本相似。

1.字符串类

String的值是不可变的,导致每次操作String都要生成新的String对象,不仅效率低,还浪费了大量有限的内存空间。String a=' a//假设A指向地址0x 0001 A=‘b’;//重新赋值后,A指向地址0x0002,但地址0x0001中存储的‘A’仍然存在,只是不再被A指向,A已经指向其他地址。所以String的操作是改变赋值地址而不是改变值。

2.StringBuffer是一个可变类,也是一个线程安全的字符串操作类。对它所指向的字符串的任何操作都不会生成新的对象。每个StringBuffer对象都有一定的缓冲容量。当字符串大小不超过容量时,将不会分配新的容量。当字符串大小超过容量时,容量会自动增加。

string buffer buf=new string buffer();//分配一个长度为16字节的字符缓冲区,String Buffer BUF=New String Buffer(512);//分配一个512字节的字符缓冲区string buffer buf=new string buffer('这是测试')//将字符串存储在缓冲区中,后面预留一个16字节的空缓冲区。

3.StringBuffer StringBuffer和StringBuilder在功能上基本相似。主要区别是StringBuffer的方法是多线程的,是安全的,而StringBuilder不是线程安全的。相比较而言,StringBuilder稍微快一点。StringBuffer和StringBuilder类应该用于其值需要经常更改的字符串。

4.线程安全StringBuffer线程安全StringBuilder线程不安全

5.速度一般来说,速度是从快到慢的:StringBuilders StringBufferstring。这个比较是相对的,不是绝对的。

6.总结(1)。如果要操作少量数据,请使用=String (2)。单线程操作=StringBuilder (3)。多线程操作=StringBuffer。

以下是代码与演示说明:复制代码如下:公共类测试字符{ final static int time=50000//循环次数

public TestCharacter(){

} public void test(String s){ long begin=system . current time millis();for(int I=0;itimeI){ s=" add ";} long over=system . current time millis();system . out . println(" Operation " s . getclass()。getName()" type takes "(over-begin)"毫秒");} public void test(string buffer s){ long begin=system . current time millis();for(int I=0;itimeI){ s . append(" add ");} long over=system . current time millis();system . out . println(" operation " s . getclass()。getcanonical name()" type takes:"(over-begin)"毫秒");} public void test(StringBuilder s){ long begin=system . current time millis();for(int I=0;itimeI){ s . append(" add ");} long over=system . current time millis();system . out . println(" Operation " s . getclass()。getName()" type takes "(over-begin)"毫秒");}

/*对线直接进行字符串拼接的测试*/public void test2(){ String S2=" ABCD ";长开始=系统。当前时间毫秒();for(int I=0;itimei ){字符串s=s2 s2 s2} long over=system。当前时间毫秒();System.out.println("操作字符串对象引用相加类型使用的时间为:"(over-begin)"毫秒");} public void test 3(){ long begin=system。当前时间毫秒();for(int I=0;iti mei){ String s=" ABCD " " ABCD " " ABCD ";}长过=系统。当前时间毫秒();System.out.println("操作字符串相加使用的时间为:"(over-begin)"毫秒");} public static void main(String[]args){ String S1=" ABCD ";字符串缓冲区st1=新的字符串缓冲区(“ABCD”);StringBuilder st2=new StringBuilder(" ABCD ");TestCharacter TC=new TestCharacter();TC。测试(S1);TC。测试(st1);TC。测试(st2);TC。test2();TC。test3();} } 我在功能强大的编辑器和磁盘操作系统下都运行了这段代码,各自打印出的时间有些不同,运行结果如下:1)myeclipse下循环10000次时:

2)myeclipse下循环50000次时:

3)在磁盘操作系统下运行时:

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: