博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
验证String、StringBuffer、StringBuilder区别
阅读量:6157 次
发布时间:2019-06-21

本文共 3318 字,大约阅读时间需要 11 分钟。

1、线程安全概念

线程安全指的是多个线程并发执行的时候,当一个线程访问该类的某个数据的时候,通过加锁的机制,保护数据,

直至当前线程读取完,释放锁后,其他线程才能继续使用,我们认为这样是线程安全的。

2、验证String、StringBuffer、StringBuilder区别

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数

据这个String类提供了数值不可改变字符串而这个StringBuffer类提供的字符串进行修改当你知道字
符数据要改变的时候你就可以使用StringBuffer典型地,你可以使用StringBuffers来动态构造字符数据 
String 类型和StringBuffer的主要性能区别:String是不可变的对象,因此在每次对String类型进行改变
的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的
字符串最好不要用String,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多
了以后, JVM 的 GC 就会开始工作,性能就会降低。 
StringBuilder是一个可变的字符序列,是JDK5.0新增的。此类提供一个与StringBuffer兼容的API,但不
保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候
(这种情况很普遍)。 

例如:

public static void main(String[] args) {       String();       StringBuffer();       StringBuilder();    }    private static void String(){        long start=System.currentTimeMillis();        String str="a";        for (int i = 0; i < 10000; i++) {            str+=i;        }        long stop=System.currentTimeMillis();        System.out.println("String time:"+(stop-start));    }    private static void StringBuffer(){        long start=System.currentTimeMillis();        StringBuffer str=new StringBuffer("a");        for (int i = 0; i < 10000; i++) {            str.append(i);        }        long stop=System.currentTimeMillis();        System.out.println("StringBuffer time:"+(stop-start));    }    private static void StringBuilder(){        long start=System.currentTimeMillis();        StringBuilder str=new StringBuilder("a");        for (int i = 0; i < 10000; i++) {            str.append(i);        }        long stop=System.currentTimeMillis();        System.out.println("StringBuilder time:"+(stop-start));    }

 结果:

此方法要在数值比较大的时候才好验证。

 

在大部分情况下,StringBuilder > StringBuffer。这主要是由于前者不需要考虑线程安全。

例如:

public static void main(String[] args) {        long a=100000;        {            List
li=new ArrayList
(); StringBuffer sb=new StringBuffer("a"); for (int i = 0; i < a; i++) { Thread tr=new Thread(){ @Override public void run() { sb.append("."); } }; tr.start(); li.add(tr); } for (Thread item:li) { try { item.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("lengthOne="+sb.length()); } //=================================== { List
li=new ArrayList
(); StringBuilder sb=new StringBuilder("a"); for (int i = 0; i < a; i++) { Thread tr=new Thread(){ @Override public void run() { sb.append("."); } }; tr.start(); li.add(tr); } for (Thread item:li) { try { item.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("lengthTne="+ sb.length()); } }

结果:

转载于:https://www.cnblogs.com/ljj5/p/9470593.html

你可能感兴趣的文章
【转】百度地图api,根据多点注标坐标范围计算地图缩放级别zoom自适应地图
查看>>
用户调研(补)
查看>>
ExtJS之开篇:我来了
查看>>
☆1018
查看>>
oracle 去掉空格
查看>>
6.13心得
查看>>
Runtime类
查看>>
eclipse decompiler
查看>>
记一个搜索网盘资源的网站
查看>>
jdk1.7和jdk1.8的String的getByte方法的差异
查看>>
java父子进程通信
查看>>
Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
查看>>
Olap学习笔记
查看>>
Codeforces Round #431 (Div. 1)
查看>>
如何进行数组去重
查看>>
将标题空格替换为 '_' , 并自动复制到剪切板上
查看>>
List Collections sort
查看>>
Mysql -- You can't specify target table 'address' for update in FROM clause
查看>>
使用局部标准差实现图像的局部对比度增强算法。
查看>>
2017-2018-1 20165313 《信息安全系统设计基础》第八周学习总结
查看>>