String、StringBuilder和StringBuffer的区别
来源:互联网 发布:淘宝主页装修教程 编辑:程序博客网 时间:2024/06/09 22:09
第一:运行速度不同(String<StringBuffer<StringBuilder)
第二:类型本质不同(String:字符串常量;StringBuffer和StringBuilder:字符串变量)
第三:StringBuffer和StringBuilder线程(StringBuffer线程安全,其大部分的方法都使用synchronized,适合多线程机制;StringBuilder线程不安全,适合单线程机制)
String:根据源码知道,定义String类是用final的,所以其是不可改变的,即为常量,有些人会困惑以下代码:
1 String s = "abcd";
2 s = s+1;
3 System.out.print(s);// result : abcd1
以上代码中,我们明明就是改变了String型的变量s的,为什么说是没有改变呢? 其实这是一种欺骗,JVM是这样解析这段代码的:首先创建对象s,赋予一个abcd,然后再创建一个新的对象s用来执行第二行代码,也就是说我们之前对象s并没有变化,所以我们说String类型是不可改变的对象了,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新的对象,而原来的对象就会变为垃圾被GC回收掉,可想而知这样执行效率会有多低。
StringBuffer和StringBuilder都集成了AbstractStringBuilder,而StringBuffer大部分方法都是synchronized,也就是线程安全的,而StringBuilder就没有,所以,我们查看API可以知道,StringBuilder可以操作StringBuffer,但是StringBuffer不可以操作StringBuilder,这也是线程的原因;所以,可想而知,StringBuffer的效率肯定没有StringBuilder,因为StringBuffer要维持同步锁,这肯定要消耗部分资源。以下代码证明三者之间的区别:
package com.seven.exercise.StringTest;import org.junit.Test;public class StringBufferWithStringBuilder { public void testString() { long start = System.currentTimeMillis(); String str = null; for (int i = 0; i < 20000; i++) { str = str + i + ","; } System.out.println(System.currentTimeMillis() - start); } public void testStringBuffer() { long start = System.currentTimeMillis(); StringBuffer sbuf = new StringBuffer(); for (int i = 0; i < 20000; i++) { sbuf.append(i + ","); } System.out.println(System.currentTimeMillis() - start); } public void testStringBulider() { long start = System.currentTimeMillis(); StringBuilder builder = new StringBuilder(); for (int i = 0; i < 20000; i++) { builder.append(i + ","); } System.out.println(System.currentTimeMillis() - start); } @Test public void test(){ testString(); testStringBuffer(); testStringBulider(); } }
运行结果如下:
121796
- String适合处理少量数据,常量
- StringBuilder适合处理单线程大量数据
- StringBuffer适合处理多线程大量数据
- StringBuffer和StringBuilder和String的区别
- String和StringBuffer和StringBuilder的区别
- StringBuffer和StringBuilder和String的区别
- 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 和StringBuffer,StringBuilder的区别
- String、StringBuilder和StringBuffer的区别
- String、StringBuilder和StringBuffer的区别
- String、StringBuilder和StringBuffer的区别
- Virustotal——md5转sha256
- 安卓自定义 View 进阶:Path 完结篇
- mysql中log-bin日志设置
- mysql处理海量数据时的一些优化查询速度方法
- 2017年多校赛第一场 1001 Add More Zero(逻辑思维)
- String、StringBuilder和StringBuffer的区别
- 百练_3682:整数奇偶排序
- 关于给APK签名简记
- Laravel 添加多语言提示信息
- Linux如何查找文件安装路径
- springboot
- dijkstra算法
- Bootstrap typeahead自动补全
- [leetcode]467. Unique Substrings in Wraparound String