`
dreamstone
  • 浏览: 283298 次
  • 来自: ...
文章分类
社区版块
存档分类

Jdk1.4 和jdk1.5中的StringBuffer的不同

阅读更多

偶尔发现,Jdk1.4 jdk1.5 中的 StringBuffer有些不同,做了个简单调查


toString()
方法 <!----> <o:p> </o:p>

jdk1.4 中: StringBuffer toString() 是这样实现的: <o:p> </o:p>

public String toString() { <o:p> </o:p>

       return new String( this ); <o:p> </o:p>

} <o:p> </o:p>

<o:p> </o:p>

继续跟踪到 String 的构造函数: <o:p> </o:p>

public String (StringBuffer buffer) { <o:p> </o:p>

        synchronized (buffer) { <o:p> </o:p>

            buffer.setShared(); <o:p> </o:p>

            this . value = buffer.getValue(); <o:p> </o:p>

            this . offset = 0; <o:p> </o:p>

            this . count = buffer.length(); <o:p> </o:p>

        } <o:p> </o:p>

 } <o:p> </o:p>

没有重新 new 内存空间,是共享的,这个时候首先想到的问题,如果 StringBuffer 变了, String 怎么办 <o:p> </o:p>

<o:p>   </o:p>

继续看 StringBuffer 的操做,例如 deleteCharAt<o:p></o:p> ()

public synchronized StringBuffer deleteCharAt( int index) { <o:p> </o:p>

        if ((index < 0) || (index >= count )) <o:p> </o:p>

           throw new StringIndexOutOfBoundsException(); <o:p> </o:p>

       if ( shared ) <o:p> </o:p>

           copy(); <o:p> </o:p>

       System.arraycopy( value , index+1, value , index, count -index-1); <o:p> </o:p>

       count --; <o:p> </o:p>

        return this ; <o:p> </o:p>

 } <o:p> </o:p>

<o:p> </o:p>

StringBuffer 改变的时候 , 判断了是否 shared, 然後决定是否 copy<o:p></o:p>

而且为了避免同步问题,把方法做成同步的 <o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

jdk1.5<o:p></o:p>

public synchronized String toString() { <o:p> </o:p>

       return new String( value , 0, count ); <o:p> </o:p>

}<o:p></o:p>

跟踪进入 String<o:p></o:p>

public String( char value[], int offset, int count) { <o:p> </o:p>

        if (offset < 0) { <o:p> </o:p>

            throw new StringIndexOutOfBoundsException(offset); <o:p> </o:p>

        } <o:p> </o:p>

        if (count < 0) { <o:p> </o:p>

            throw new StringIndexOutOfBoundsException(count); <o:p> </o:p>

        } <o:p> </o:p>

        // Note: offset or count might be near -1>>>1. <o:p> </o:p>

        if (offset > value. length - count) { <o:p> </o:p>

            throw new StringIndexOutOfBoundsException(offset + count); <o:p> </o:p>

        } <o:p> </o:p>

        char [] v = new char [count]; <o:p> </o:p>

        System.arraycopy(value, offset, v, 0, count); <o:p> </o:p>

        this . offset = 0; <o:p> </o:p>

        this . count = count; <o:p> </o:p>

        this . value = v; <o:p> </o:p>

}<o:p></o:p>

重新分配了内存空间 <o:p> </o:p>

<o:p> </o:p>

再来看看 StringBuffer deleteCharAt<o:p></o:p>

public synchronized StringBuffer deleteCharAt( int index) { <o:p> </o:p>

        super .deleteCharAt(index); <o:p> </o:p>

        return this ; <o:p> </o:p>

} <o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

有了继承关系,先不管,继续 <o:p> </o:p>

public AbstractStringBuilder deleteCharAt( int index) { <o:p> </o:p>

        if ((index < 0) || (index >= count )) <o:p> </o:p>

           throw new StringIndexOutOfBoundsException(index); <o:p> </o:p>

       System.arraycopy( value , index+1, value , index, count -index-1); <o:p> </o:p>

       count --; <o:p> </o:p>

        return this ; <o:p> </o:p>

} <o:p> </o:p>

不需要判断,也不需要 copy <o:p> </o:p>

<o:p> </o:p>

既然看到了继承关系,那我们先看一下这个继承关系,再得出结论 <o:p> </o:p>

发现 <o:p> </o:p>

abstract class AbstractStringBuilder implements Appendable, CharSequence <o:p> </o:p>

然後 <o:p> </o:p>

public final class StringBuffer <o:p> </o:p>

    extends AbstractStringBuilder <o:p> </o:p>

    implements java.io.Serializable, CharSequence <o:p> </o:p>

<o:p> </o:p>

public final class StringBuilder <o:p> </o:p>

    extends AbstractStringBuilder <o:p> </o:p>

    implements java.io.Serializable, CharSequence<o:p></o:p>

<o:p> </o:p>

分享到:
评论

相关推荐

    Java正则表达式

    正则表达式是JDK 1.4的新功能,但是对sed和awk这样的Unix的标准实用工具,以及Python,Perl之类的语言来讲,它早就已经成为其不可或缺的组成部分了(有人甚至认为,它还是Perl能大获成功的最主要的原因)。单从技术...

    涵盖了90%以上的面试题

    jdk1.5新特性 jdk1.7新特性 jdk1.8新特性 java语言有哪些优点? 同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 如何在main方法执行前输出”hello ...

    JDK源码分析之String、StringBuilder和StringBuffer

    主要给大家介绍了关于JDK源码分析之String、StringBuilder和StringBuffer的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用jdk具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    jdk8-source-code:jdk源码解析

    jdk1.8-source-analysis JDK1.8源码分析引入原始过程中的注意事项JDK1.8对应JDK版本下载: 码:49wi原始码在src目录下以下两个类手动添加的,解决编译过程中该包的丢失sun.font.FontConfigManager sun.awt....

    sql转为StringBuffer

    方便人们把sql转化为StringBuffer拼接语句,也可以转为String拼接语句,jdk要在1.6以上,并且配置了JAVAHOME才能运行

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

    jdk1.8-source-analysis JDK1.8源码分析引入原始过程中的注意事项JDK1.8对应JDK版本下载: 码:49wi原始码在src目录下以下两个类手动添加的,解决编译过程中该包的丢失sun.font.FontConfigManager sun.awt....

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

    java.lang.ref和jdk.internal.ref下的各种引用:软引用/弱引用/虚引用 Unsafe的实现(JDK9之后有两个同名类,一个引用了另一个,建议放在一起阅读) java.util.stream下的流式编程的实现(很难) Thread和...

    Java JDK实例宝典

    第1章 Java基础 1.1 转换基本数据类型 1.2 Java的运算符 1.3 控制程序的流程 1.4 计算阶乘 1.5 实现命令行程序 第2章 Java面向对象程序设计 2. 1 复数类 2. 2 equals.chashCode...

    RSA+bcpkix-jdk15.zip

    //注意JS中用到的encryptionExponent和modulus通过pk.getPublicKey().toString()字符串中得到. } /** * * 生成密钥对 * @return KeyPair * @throws EncryptException */ public static KeyPair ...

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

    1.请手动添加jdk下面的lib到path中 2.lib文件夹下面的junit测试jar包添加到path中,以便编写测试用例 学习计划 很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的...

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

    java biginteger 源码 阅读JDK源码项目 2020.07.14创建该项目,目的...java.lang.ref和jdk.internal.ref下的各种引用:软引用/弱引用/虚引用 Unsafe的实现(JDK9之后有两个同名类,一个引用了另一个,建议放在一起阅读

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

    请手动添加jdk下面的lib到path中 2.lib文件夹下面的junit测试jar包添加到路径中,刹车编写测试用例 学习计划 以下为小编整理的通常所需阅读的二进制范围。标题为包名,后面序号为优先级1-4,优先级递减 1,java.lang...

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

    1.请手动添加jdk下面的lib到path中 2.lib文件夹下面的junit测试jar包添加到path中,以便编写测试用例 学习计划 很多java开发的小伙伴都会阅读jdk源码,然而确不知道应该从哪读起。以下为小编整理的通常所需阅读的...

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

    jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...

    Java入门教程(微学苑)-part1

    2.18 String和StringBuffer的效率对比 38 2.19 StringBuilder类 39 2.20 总结 39 2.21 强调一下编程风格 40 3 Java类与对象 42 3.1 Java类的定义及其实例化 42 3.2 构造方法 42 3.3 创建对象 43 3.4 访问成员变量和...

    关于JDK8中的字符串拼接示例详解

    字符串拼接问题应该是每个Java程序员都熟知的事情了,几乎每个Java程序员都读过关于StringBuffer/StringBuilder来拼接字符串...下面这篇文章主要给大家介绍了关于JDK8中的字符串拼接的相关资料,需要的朋友可以参考下。

    张孝祥Java就业培训教程.pdf

    6.3 String类和StringBuffer类 6.4 基本数据类型的对象包装类 6.5 集合类 6.6 Hashtable与Properties类 6.7 System类与Runtime类 6.8 Date与Calendar,DateFormat类 6.9 Math与Random类 6.10 学习API的方法 第7章 IO...

    Java语法基础-面试专题及答案

    6.什么是 Java 程序的主类 应用程序和小程序的主类有何不同 7.Java 应用程序与小程序之间有那些差别 8.字符型常量和字符串常量的区别 9. 构造器 Constructor 是否可被 override 10.重载和重写的区别 11.Java 面向...

    java jdk实列宝典 光盘源代码

    java为数据结构中的映射定义一个接口java.util.Map,有四个实现类HashMap Hashtable LinkedHashMap TreeMap用法和区别;对Map排序; 5字符串 使用String;判断一个字符串是否是合法的java标识符;使用StringBuffer;...

    Java-String&StringBuilder&StringBuffer的区别与分析

    我们先用一张表格来回顾一下Java中String,StringBuilder,StringBuffer关于值可变性、线程安全性、时间性能排序、常用场景等主要区别。见下表: 数据类型 值可变性 线程安全性 时间性能排名 常用场景 String...

Global site tag (gtag.js) - Google Analytics