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

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_JDK1.4api手册中文版

    3. **日期和时间**:`java.util.Date`和`java.text.SimpleDateFormat`处理日期和时间格式化,Java 1.4中还引入了`java.util.Calendar`类,提供了更强大的日期时间操作。 4. **XML处理**:`javax.xml`包包含了处理...

    scjp认证指南JDK1.6,jdk1.5

    6. **字符串处理**:String类是Java中的重要组成部分,理解它的不可变性,熟悉StringBuilder和StringBuffer的使用,以及字符串连接的效率问题。 7. **内存管理与垃圾回收**:Java自动进行内存管理,理解堆和栈的...

    jdk1.5免安装

    除此之外,JDK1.5还对字符串进行了优化,例如,String类增加了substring()的效率,以及加入了StringBuilder和StringBuffer的append()方法,这些改进提升了字符串操作的性能。 总的来说,JDK1.5免安装版为开发者提供...

    JDK 1.5以后的新特性

    泛型是JDK 1.5引入的一个核心特性,允许在类、接口和方法中使用类型参数,从而实现更安全、更强大的类型约束。在泛型出现之前,开发者通常使用Object作为通用类型,但这可能导致类型转换异常。泛型通过在类声明中...

    jdk1.5 1.6 1.7的新特征总结

    【JDK1.5新特性】 1. 泛型(Generic) JDK1.5引入了泛型,这是对类型安全的重要改进。泛型允许在集合类中指定元素的类型,确保了在编译时就能进行类型检查,避免了运行时的强制类型转换和可能的ClassCastException...

    jdk1.8源码+中文注释(chm格式)

    9. **String的优化**:JDK1.8对字符串进行了优化,例如新增了`String.join()`方法,以及`StringBuilder`和`StringBuffer`的改进,提升了字符串操作的效率。 10. **Optional类**:为了解决Java中的null安全问题,JDK...

    JAVA设计模式在JDK中的应用

    ### JAVA设计模式在JDK中的应用 #### 一、引言 在软件开发过程中,设计模式作为一套被广泛接受的解决方案,能够帮助开发者解决常见的设计问题。Java作为一门流行的编程语言,其标准库(JDK)中巧妙地融入了多种设计...

    jdk6-8String类

    在JDK的不同版本中,`String`类经历了一些优化和改进,尤其是在性能和内存管理方面。这里我们将对JDK 1.6、1.7和1.8中的`String`类进行对比研究,探讨其中的关键变化。 ### JDK 1.6中的String 在JDK 1.6中,`...

    jdk1.7 64位官方正式版 jdk-7u79-linux-x64

    Java Development Kit (JDK) 是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK 1.7(也称为Java 7)是Oracle公司发布的一个重要版本,它引入了许多新特性,优化了性能,...

    jdk1.7 安装包

    4. **字符串内联**:JDK 1.7优化了字符串操作,对字符串拼接使用StringBuilder或StringBuffer进行优化,提升了性能。 5. **二进制字面量和下划线分隔符**:Java 7引入了二进制字面量(如0b1010)和数字间允许使用...

    Java JDK 7学习笔记 PDF

    这些是Java JDK 7中一些关键的更新和改进,对于开发者来说,理解和掌握这些知识点对于提升编程效率和写出高质量的Java代码至关重要。通过这份PDF学习笔记,读者将能深入理解JDK 7的新特性,并能将其应用到实际项目中...

    JDK1.6中文开发API

    在JDK1.6版本中,Java语言和库经历了许多改进和增强。以下是一些关键知识点: 1. **泛型(Generics)**:JDK1.6全面支持泛型,这使得代码更安全,类型检查在编译时就能完成,避免了运行时的ClassCastException。...

    jdk-7u191-linux-x64.tar.gz.zip

    Java Development Kit(JDK)是Java编程语言的核心组件,它包含了一套开发和运行Java应用程序所需的工具和库。"jdk-7u191-linux-x64" 是Oracle公司为Linux 64位操作系统发布的JDK 7的更新版本191。在Oracle官网不再...

    JDK8免安装解压包

    - **String的多次追加优化**:`StringBuilder`和`StringBuffer`的`append()`方法在循环中更加高效。 - **重复注解**:一个注解可以在同一个元素上重复使用,增加了注解的灵活性。 ### 使用场景 这个免安装的JDK8...

    JDK中的设计模式

    ### JDK中的设计模式 ...综上所述,JDK中广泛地应用了各种设计模式,这些模式不仅提高了代码的质量,还增强了系统的灵活性和可扩展性。理解这些模式的原理及其在JDK中的具体实现,对于深入学习Java编程至关重要。

    Java JDK1.8帮助文档。

    这些只是JDK1.8中部分重要更新和改进,详细帮助文档会涵盖更多内容,包括类库的每个类和方法的使用说明,开发者可以根据具体需求查阅相应的章节,以获取更全面的知识。对于Java开发者来说,深入理解JDK1.8的特性不仅...

    jdk1.7历史各版本-正式版下载

    2. **字符串字面量连接优化**:在JDK 1.7中,字符串的连接操作被优化,通过使用StringBuilder或StringBuffer的自动扩容机制,提高了字符串拼接的效率。 3. **try-with-resources语句**:这是JDK 7中的一个新特性,...

    jdk 1.7免安装版

    在Windows系统中,配置JDK通常涉及两个关键步骤:设置环境变量和验证安装。首先,你需要将JDK的安装目录添加到系统的PATH环境变量中,这样系统就能在任何位置找到Java命令。对于免安装版,这意味着你需要手动指定...

    jdk1.7 64位 32位 官方正式版下载

    【描述】中的"jdk-7u80-windows-x64.7z"和"jdk-7u25-linux-x64.tar.gz"分别对应了两个不同的JDK1.7更新版本,"u80"和"u25"代表的是更新版本号。对于Windows用户,提供了7z格式的压缩包,这是一个高效的压缩格式,...

    JDK library usage analyze.

    在这个分析过程中,开发者通常会关注JDK提供的各种API如何被有效利用,以提升代码的效率、可读性和维护性。 描述中的“NULL”意味着没有具体的细节描述,但我们可以通过常见的JDK库分析实践来推测可能涉及的内容。...

Global site tag (gtag.js) - Google Analytics