`
niwtsew
  • 浏览: 68793 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java.lang.StringBuffer VS java.lang.StringBuilder

阅读更多
java.lang.StringBuffer:  thread-safe(之所以是thread-safe的是因为它的所有方法(构造函数除外)都是synchronized的)
java.lang.StringBuilder: not thread-safe, much faster than StringBuffer since no synchronization.
StringBuilder was introduced since JDK1.5 and it provides the same operation as StringBuffer.


AbstractStringBuilder里有个乍看很巧妙细看很愚蠢再仔细推敲很高明的函数 static int stringSizeOfInt(int x) ,该函数返回整形数字x的长度,比如x=5,返回长度1,x=10,返回2,x=999.返回3.请看实现:
    final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
                                     99999999, 999999999, Integer.MAX_VALUE };

    // Requires positive x
    static int stringSizeOfInt(int x) {
        for (int i=0; ; i++)
            if (x <= sizeTable[i])
                return i+1;
    }

    // Requires positive x
    static int stringSizeOfLong(long x) {
        long p = 10;
        for (int i=1; i<19; i++) {
            if (x < p)
                return i;
            p = 10*p;
        }
        return 19;
    }

为啥不直接用String.valueOf(x).length()呢?(负数的时候,-1即可啊) 猜想:应该是这种算法的效率更高?(看String.valueOf()的实现吧)。
BTW:可以看到JDK的代码里,存在一些看着不是那么优雅和简洁明了的代码,根据这个猜想,有些时候为了获得性能方面的提升,丑陋的代码还是需要的,呵呵。

令一个很好的算法同样位于AbstractStringBuilder,reverse()函数,实现如下(下例去除掉关于utf-16 surrogate的考虑)
    public AbstractStringBuilder reverse() {
    int n = count - 1;
    for (int j = (n-1) >> 1; j >= 0; --j) {
        char temp = value[j];
        char temp2 = value[n - j];
        value[j] = temp2;
        value[n - j] = temp;
    }
    return this;
    }
由此可以引伸出reverse(char[]) or reverse(String)等等。。。

注意AbstractStringBuilder虽然是一个abstract,但是只有一个方法是abstract的,就是String toString(). 而StringBuffer和StringBuilder都是exteds AbstractStringBuilder,它俩各个方法的重载基本上都是调用了super.xxxx ,唯一不同的是synchronization以及返回值的不同.
至于String和这俩的区别,没啥好说的,google一大把
分享到:
评论

相关推荐

    Java基础知识点总结.docx

    &lt; java.lang &gt;StringBuilder字符串缓冲区:★★★☆ 74 基本数据类型对象包装类★★★☆ 75 集合框架:★★★★★,用于存储数据的容器。 76 &lt; java.util &gt; Collection接口 77 &lt; java.util &gt;Iterator接口 78 &lt; java....

    Java资源加载库Azzet.zip

    , java.io.InputStream, java.nio.ByteBuffer, java.io.ByteArrayOutputStream)TXT (java.lang.String, char[], java.nio.CharBuffer, java.lang.StringBuffer, java.lang.StringBuilder)支持的数据源:...

    Android知识体系梳理(4)-Java基础篇-Object方法分析,String的深度解析,String Pool分析,与StringBuilder、StringBuffer的对比

    其实,他们使用起来虽然简单,但比如Object类是位于java.lang包中的,java.lang是包含了Java最基础和核心的类,在编译时会自动导入的。Object类同时是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象...

    java8源码-jdk8:jdk8源码阅读理解

    String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、StringCharacterIterator、CharsetProvider、CharsetEncoder、CharsetDecoder(较难) java.util...

    用程序输出“当前时间是XXXX年XX月XX日XX时XX分XX秒(第XX周,周X)

    2 比较String与StringBuffer、StringBuilder的自增速度。方法:在自增前记录系统时间,进行5000次自增,然后再记录系统时间,可以得出自增的速度。获取系统时间的方法是java.lang.System.currentTimeMillis() ,见...

    javajdk源码学习-JavaSourceLearn:JDK源码学习

    java.lang Object 1 String 1 AbstractStringBuilder 1 StringBuffer 1 StringBuilder 1 Boolean 2 Byte 2 Double 2 Float 2 Integer 2 Long 2 Short 2 Thread 2 ThreadLocal 2 Enum 3 Throwable 3 Error 3 ...

    javabiginteger源码-read-jdk-source:阅读jdk

    String、StringBuffer、StringBuilder、StringJoiner、StringTokenizer(补充正则表达式的知识) CharacterIterator、StringCharacterIterator、CharsetProvider、CharsetEncoder、CharsetDecoder(较难) java.util...

    java阅读源码-JavaSourceCodeRead:JavaSourceCodeRead

    java 阅读源码 jdk1.8 源码阅读 java.lang包 Object String AbstractStringBuilder StringBuffer StringBuilder

    JAVA基础课程讲义

    字符串(java.lang.String类)的使用 90 字符串相等的判断 92 思考作业 93 上机作业 94 第四章 异常机制 95 导引问题 95 异常(Exception)的概念 96 异常分类 96 Error 97 Error和Exception的区别 97 Exception 97 ...

    Collections源码java-jdk1.8-source-analysis:Java8源码分析,J.U.C、ThreadPool、Col

    Collections ...1、java.lang 1) Object 1 2) String 1 3) AbstractStringBuilder 1 4) StringBuffer 1 5) StringBuilder 1 6) Boolean 2 7) Byte 2 8) Double 2 9) Float 2 10) Integer 2 11) Long 2 12)

    java源码剖析-JavaSourceLearn:JDK1.8源码的代码分析和学习

    1、java.lang 1) Object 1 2) String 1 3) AbstractStringBuilder 1 4) StringBuffer 1 5) StringBuilder 1 6) Boolean 2 7) Byte 2 8) Double 2 9) Float 2 10) Integer 2 11) Long 2 12) Short 2 13) Thread

    jdk1.8-source-analysis:Java 8源码分析,JUC,ThreadPool,Collection

    jdk1.8-source-analysis JDK1.8源码分析 引入原始过程中的注意事项 ...1,java.lang 1) Object 1 2) String 1 3) AbstractStringBuilder 1 4) StringBuffer 1 5) StringBuilder 1 6) Boolean 2 7) Byte 2 8) Doub

    jdk1.8-source-analysis:JDK1.8源码分析

    jdk1.8-source-analysis JDK1.8源码...标题为包名,后面序号为优先级1-4,优先级递减1,java.lang 1) Object 12) String 13) AbstractStringBuilder 14) StringBuffer 15) StringBuilder 16) Boolean 27) Byte 28) Doub

    疯狂JAVA讲义

    9.3.2 String、StringBuffer和StringBuilder类 322 9.3.3 Math类 327 9.3.4 Random类 328 9.3.5 BigDecimal类 330 9.4 处理日期的类 333 9.4.1 Date类 333 9.4.2 Calendar类 334 9.4.3 TimeZone类 337 9.5 ...

    jdk8-source-code:jdk源码解析

    jdk1.8-source-analysis JDK1.8源码...标题为包名,后面序号为优先级1-4,优先级递减1,java.lang 1) Object 12) String 13) AbstractStringBuilder 14) StringBuffer 15) StringBuilder 16) Boolean 27) Byte 28) Doub

    knowledge-interview:知识学习

    都在java.lang 包下 String使用final修饰,不可变,每次字符串变更都是创建新的字符串,String s = “a”+"b"除外,频繁变更会导致无引用对象过多,导致gc影响性能。 StringBuffer是线程安全的,每次变更是对本身...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】java中String、StringBuffer、StringBuilder的区别 21 【基础】运行时异常和非运行时异常 参见 21 运行时异常 21 非运行时异常 22 【基础】java引用类型 23 强引用(StrongReference) 23 软引用...

    for循环中如何正确使用字符串拼接

    众所周知,常见的拼接方式有:StringBuffer,StringBuilder,concat,+,StringUtils.join 那么通过如下代码,看一下在for循环中,不同的字符串拼接方式,到底哪种效率最高?  package com.test.stringjoin; import org...

    javaSE代码实例

    3.10 常用数学工具包——java.lang.Math类 39 3.10.1 数学常量 39 3.10.2 常用数学函数 40 3.11 小结 41 第4章 流程控制——Java世界的航行舵手 42 4.1 if条件语句 42 4.1.1 简略形式 42 4.1.2 完全...

Global site tag (gtag.js) - Google Analytics