首页 > Java > java教程 > 正文

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

高洛峰
发布: 2017-01-22 11:39:57
原创
1867人浏览过

1. string 类 

  string的值是不可变的,这就导致每次对string的操作都会生成新的string对象,不仅效率低下,而且大量浪费有限的内存空间。 
string a = "a"; //假设a指向地址0x0001 
a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的,a 已经指向了其它地址。 
因此string的操作都是改变赋值地址而不是改变值操作。 

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

stringbuffer buf=new stringbuffer(); //分配长16字节的字符缓冲区 
stringbuffer buf=new stringbuffer(512); //分配长512字节的字符缓冲区 
stringbuffer buf=new stringbuffer("this is a test")//在缓冲区中存放了字符串,并在后面预留了16字节的空缓冲区。 

3.stringbuffer 
  stringbuffer和stringbuilder类功能基本相似,主要区别在于stringbuffer类的方法是多线程、安全的,而stringbuilder不是线程安全的,相比而言,stringbuilder类会略微快一点。对于经常要改变值的字符串应该使用stringbuffer和stringbuilder类。 

4.线程安全 
stringbuffer 线程安全 
stringbuilder 线程不安全 

5.速度 
一般情况下,速度从快到慢:stringbuilder>stringbuffer>string,这种比较是相对的,不是绝对的。 

6.总结 
(1).如果要操作少量的数据用 = string 
(2).单线程操作字符串缓冲区 下操作大量数据 = stringbuilder 
(3).多线程操作字符串缓冲区 下操作大量数据 = stringbuffer 

以下是代码与演示说明:

public class TestCharacter { 
final static int time = 50000; //循环次数 

public TestCharacter(){ 

} 
public void test(String s){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
s += “add”; 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”); 
} 
public void test(StringBuffer s){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
s.append(“add”); 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作”+s.getClass().getCanonicalName()+”类型使用的时间为:”+(over-begin)+”毫秒”); 
} 
public void test(StringBuilder s){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
s.append(“add”); 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作”+s.getClass().getName()+”类型使用的时间为:”+(over-begin)+”毫秒”); 
} 

/*对 String 直接进行字符串拼接的测试*/ 
public void test2(){ 
String s2 = “abcd”; 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
String s = s2 + s2 +s2; 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作字符串对象引用相加类型使用的时间为:”+(over-begin)+”毫秒”); 
} 
public void test3(){ 
long begin = System.currentTimeMillis(); 
for(int i=0; i<time; i++){ 
String s =”abcd” + “abcd” + “abcd”; 
} 
long over = System.currentTimeMillis(); 
System.out.println(“操作字符串相加使用的时间为:”+(over-begin)+”毫秒”); 
} 
public static void main(String[] args){ 
String s1 = “abcd”; 
StringBuffer st1 = new StringBuffer(“abcd”); 
StringBuilder st2 = new StringBuilder(“abcd”); 
TestCharacter tc = new TestCharacter(); 
tc.test(s1); 
tc.test(st1); 
tc.test(st2); 
tc.test2(); 
tc.test3(); 
} 
}
登录后复制

我在myeclipse和dos下都运行了这段代码,各自打印出的时间有些不同,运行结果如下: 
1)myeclipse下循环10000次时: 

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

2)myeclipse下循环50000次时:

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

立即学习Java免费学习笔记(深入)”;

模力视频
模力视频

模力视频 - AIGC视频制作平台 | AI剪辑 | 云剪辑 | 海量模板

模力视频 425
查看详情 模力视频

3)在DOS下运行时:

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

更多全面解释java中StringBuilder、StringBuffer、String类之间的关系相关文章请关注PHP中文网!


java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号