zoukankan      html  css  js  c++  java
  • Java开发StringBuilder类

    StringBuffer类和StringBuilder类功能基本相似。算是两个双胞胎。
    下面主要说两点

    第一点 线程安全
    StringBuffer 线程安全
    StringBuilder 线程不安全

    关于线程安全的知识,正在学习,刚接触,没有太深入的了解,在这知识稍微的提一下。

    线程安全——如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次
    运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

    StringBuffer类和StringBuilder类两者没有很大的区别,但是在线程安全方面,StringBuffer允许多线程进行字
    符操作。这是因为在源代码中StringBuffer的很多方法都被关键字synchronized(这个关键字是为线程同步机制设定
    的。) 修饰了,而StringBuilder没有。

    简单的说一说synchronized的含义:
    每一个类对象都对应一把锁,当某个Java技术线程A调用类对象O中的synchronized方法M时,必须获得对象O的锁才能够执行
    M方法,否则线程A阻塞。一旦线程A开始执行M方法,将独占对象O的锁。使得其它需要调用O对象的M方法的线程阻
    塞。只有线程A执行完毕,释放锁后。那些阻塞线程才有机会重新调用M方法。这就是解决线程同步问题的锁机制。

    因此,多线程编程中StringBuffer比StringBuilder要安全的多。

    有一点需要注意的是,有的人会问,String类是不是也不安全? 事实上不存在这个问题,String是不可变的。线
    程对于堆中指定的一个String对象只能读取,无法修改。还有什么不安全的?

    第二点 效率问题
    一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
    举个简单的例子:
    [java] view plaincopy在CODE上查看代码片派生到我的代码片
    public class TestCharacter{
    final static int time=100; //循环次数

    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();
    }

    }

  • 相关阅读:
    swagger生成接口文档
    二分查找通用模板
    go-json技巧
    【Go】获取用户真实的ip地址
    数据库储存时间类型
    密码加密:md5/sha1 +盐值
    参数里时间格式的转换
    不好定位的元素定位
    vim编辑器
    ps -ef | grep php kill -9
  • 原文地址:https://www.cnblogs.com/gojava/p/4469547.html
Copyright © 2011-2022 走看看