String、StringBuilder、StringBuffer类之间的区别与联系
来源:互联网 发布:数控仿真软件下载 编辑:程序博客网 时间:2024/05/17 08:32
String是immutable类,则每次对String操作都会产生新的String对象,这样效率十分底下,而且浪费内存。
StringBuffer是可变的类和线程安全的字符串操作类,任何对它指向的字符串操作都不会产生新的对象。
StringBuilder类与StringBuffer类的功能基本相同。
下面我们来具体阐释一下三种类的用法:
1、String类:
String类是不可变的类,导致每次对String的操作都会产生新的String对象,这样的操作效率低下,而且浪费内存。
例如:String a=“hello”,假设a字符串指向的地址为0x0002,a=“java”,重新赋值后指向的地址指向0x0003,但是原来的地址0x0002中保存的“hello”仍然存在,但已经不是字符串a所指向的地址了,因为这时候字符串a指向了“java”字符串的地址。因此String的操作都是改变赋值地址而不是改变值操作。
2、StringBuffer类:
StringBuffer是可变的类和线程安全的字符串操作类,任何对它指向的字符串操作都不是产生新的对象。每一个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。默认情况下,StringBuffer会分配16字节的字符缓冲区。
StringBuffer buf=new StringBuffer();这是默认情况下,分配16字节的字符缓冲区
StringBuffer buf=new StringBuffer(512);分配长512字节的字符缓冲区
StringBuffer buf=new StringBuffer(“hello,this is Java”);在缓冲区中存放了字符串,并在后面预留了16个字节的缓冲区
3、StringBuilder类:
StringBuilder类和StringBuffer类功能基本相似,主要区别在于StringBuffer类的方法是多线程、安全的,而StringBuilder不是线程安全的,相比较而言,StringBuilder类会略微快一点,对于经常要改变值的字符串,应该使用StringBuffer类或者StringBuilder类。
StringBuffer类:线程安全
StringBuilder类:线程不安全
速度比较:StringBuilder类最快,StringBuffer类次之,String类最慢,当然这种比较是相对的,不是绝对的。
使用情况总结:
1、当操作的数据量较少时:使用String类
2、单线程操作字符串缓冲区下操作大量的数据时:使用StringBuilder类
3、多线程操作字符串缓冲区下操作大量的数据时:使用StringBuffer类
下面放上一些比较的源码:
package programmer;public class TestString3 {final static int times = 50000; // 循环次数public void test(String s) {long begin = System.currentTimeMillis();for (int i = 0; i < times; 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 < times; 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 < times; 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 < times; 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 < times; i++) {String s = "abcd" + "abcd" + "abcd";}long over = System.currentTimeMillis();System.out.println("操作字符串相加使用的时间为:" + (over - begin) + "毫秒");}public static void main(String[] args) {String s = "abcd";StringBuffer sbf = new StringBuffer("abcd");StringBuilder sbd = new StringBuilder("abcd");TestString3 tc = new TestString3();tc.test(s);tc.test(sbf);tc.test(sbd);tc.test2();tc.test3();}}
运行结果如下:
运行结果可以看出三者之间的区别。
- String、StringBuilder、StringBuffer类之间的区别与联系
- String,StringBuffer,StringBuilder的区别与联系
- String 、StringBuffer、与StringBuilder之间的区别
- String StringBuffer与StringBuilder之间的区别
- String、StringBuffer与StringBuilder之间的区别
- String,StringBuffer与StringBuilder之间的区别
- String、StringBuffer与StringBuilder之间的区别
- String、StringBuffer与StringBuilder 之间的区别
- String,StringBuffer,StringBuilder之间的区别和联系
- String,StringBuffer,StringBuilder之间的区别和联系
- String,StringBuffer与StringBuilder三者之间的区别与联系
- String, StringBuilder 与StringBuffer的区别与联系
- String, StringBuilder 与StringBuffer的区别与联系
- String, StringBuilder 与StringBuffer的区别与联系
- String、StringBuffer与StringBuilder的区别与联系
- String, StringBuilder 与StringBuffer的区别与联系
- String, StringBuffer, StringBuilder区别与联系
- String、StringBuffer、StringBuilder区别与联系
- win7 利用IIS建立自己的本地.net网站
- JAVA容器--简单介绍(1)
- 默认边长为1
- 常用宏定义和设备的判断
- UVa 138 Street Numbers
- String、StringBuilder、StringBuffer类之间的区别与联系
- 工资排序。。
- Monkeyrunner的环境配置
- 通过U盘更新程序
- java bean
- 建设网络强国,反制黑客入侵
- 第八章 多元函数微分法及其应用
- 【项目1-三角形类的构造函数】-使用有默认参数的构造函数
- java面试题及答案(基础题122道,代码题19道)