`
tzhiyuan
  • 浏览: 705 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

【Java源码学习】关于String、StringBuffer、StringBuilder

阅读更多
    说来惭愧,用Java开发这么久了都没有好好研究下Java的源代码,很多东西知其然却不知其所以然,导致现在对Java还是一知半解。趁这段时间慢慢研究下Java的源码,巩固下基础知识。

    闲话不多说,先来看一下最常见的String、StringBuffer、StringBuilder这三个类的实现吧。为什么说String是不可变的,而StringBuffer、StringBuilder却是可变的。

    首先这三个类是用char[] value来存储值的,而String类只能在构造函数中设置value长度和值。也就是说如果要改变String的值必须要新创建一个对象,这样在我们进行大量的字符串操作的时候就会产生大量的String对象,即使很多String对象的值都是相等的。为了解决这个问题Java引入了字符串缓存池的概念。就是将创建的String对象都放到缓存池中,如果String对象的值相等的话就使用缓存池中的对象,不再重新创建。这样就能解答诸如:
String a = new String("abc");
String b = new String("abc");
到底创建了几个对象。

    鉴于String类在大量字符串操作时产生大量对象的情况,Java又提供了两个类来解决这个问题,就是StringBuffer、StringBuilder,这两个类都继承自AbstractStringBuilder。先来看StringBuffer类的构造函数:
    public StringBuffer() {
	super(16);
    }

    public StringBuffer(String str) {
	super(str.length() + 16);
	append(str);
    }

父类中的构造函数
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

StringBuffer的默认大小是16,也是使用char[]来保存值,与String类不同的是它还提供了append方法来改变value的大小和值。当value的长度不够存储是,会自动进行扩容,默认新的长度为(value.length + 1) * 2,如果仍然长度不够则扩容为新字符串的长度。
    public synchronized StringBuffer append(String str) {
	super.append(str);
        return this;
    }

    public AbstractStringBuilder append(String str) {
	if (str == null) str = "null";
        int len = str.length();
	if (len == 0) return this;
	int newCount = count + len;
	if (newCount > value.length)
	    expandCapacity(newCount);
	str.getChars(0, len, value, count);
	count = newCount;
	return this;
    }

    void expandCapacity(int minimumCapacity) {
	int newCapacity = (value.length + 1) * 2;
        if (newCapacity < 0) {
            newCapacity = Integer.MAX_VALUE;
        } else if (minimumCapacity > newCapacity) {
	    newCapacity = minimumCapacity;
	}
        value = Arrays.copyOf(value, newCapacity);
    }


    StringBuilder提供了兼容StringBuffer的功能,那么StringBuffer与StringBuilder有什么区别呢?还是看代码:
StringBuffer类
    public synchronized StringBuffer append(String str) {
	super.append(str);
        return this;
    }



StringBuilder类
    public StringBuilder append(String str) {
	super.append(str);
        return this;
    }

很容易看出StringBuffer是保证同步的,而StringBuilder不是,因此StringBuilder的效率要高一些。所以一般推荐使用StringBuilder,但是涉及到多线程调用的需要使用StringBuffer。
分享到:
评论

相关推荐

    JAVA面试题 从源码角度分析StringBuffer和StringBuilder的区别

    JAVA面试题,从源码角度分析StringBuffer和StringBuilder的区别 在本文中,我们将从源码角度分析StringBuffer和StringBuilder的区别,这两个类都是Java中常用的字符串操作类,但是它们之间有什么区别呢?下面我们来...

    Java类库复习——java.lang.String

    在`String`的源码中,可以学习到如何设计一个高效且安全的不可变类。 总的来说,`String`类是Java开发中不可或缺的一部分,理解和掌握其特性和方法对于编写高质量的代码至关重要。通过深入研究源码,我们能更深入地...

    Java资深开发工程师知识体系.docx

    String、StringBuilder、StringBuffer 都是 Java 中的字符串类,但是它们有不同的设计目标和使用场景: * String 类是不可变的,适合读取操作。 * StringBuilder 类是可变的,适合大量字符串拼接操作。 * ...

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

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

    java源码:Notebook源码,Java记事本.rar

    【标题】"java源码:Notebook源码,Java记事本.rar" 是一个Java编程的项目,其中包含了实现一个简单记事本应用的源代码。这个应用可能提供了基本的文字编辑功能,如新建、打开、保存、复制、粘贴、剪切、查找和替换...

    Java弱引用实现源码-coding-guide_i3geek:一名JAVA程序员,将自己的编程学习之路做以总结并进行分享。内容包括但不限于数

    一名JAVA程序员,将自己的编程学习之路做以总结并进行分享。内容包括但不限于数据结构、算法、数据库、操作系统、计算机网络等多方面。 博文: 目前先暂列目录,内容在逐渐增加中 JAVA 关键字 void byte int long ...

    api_StringBuffer.zip_fullvgv_java_tasteazi

    在分析`StringBuffer`的源码时,可以学习到其内部如何实现线程安全的字符串操作,例如如何管理字符数组的大小以及在添加、删除和替换操作时如何进行同步控制。通过阅读源码,开发者可以深入理解Java的内存管理和多...

    Java学习资料&项目源码 java基础se的课堂代码练习

    "Java学习资料&项目源码,java基础se的课堂代码练习"这个标题表明这是一个关于Java Standard Edition (SE)的基础学习资源,包含了实际的课堂代码练习,帮助初学者深入理解和掌握Java编程。 在Java SE中,学习者将...

    java2全方位学习书源码

    Java2全方位学习书源码包含了丰富的Java编程实例,旨在帮助初学者深入理解Java语言的核心概念和技术。这本书籍通过实例教学的方式,将理论与实践相结合,让读者能够更好地掌握编程技能。下面,我们将从多个方面详细...

    corejava JAVA核心编程 里的源代码

    5. **字符串处理**:String类在Java中扮演着重要角色,学习其不可变性、常用方法以及StringBuilder和StringBuffer的使用是必要的。 接下来,进阶话题: 6. **集合框架**:List、Set和Map接口以及ArrayList、...

    Java字符串格式化

    总结来说,Java字符串格式化是构建和展示文本信息的关键技术,包括使用`String.format()`和`printf()`方法,以及`StringBuilder`和`StringBuffer`类。同时,理解并处理GBK这样的特定字符编码对于处理中文字符至关...

    基于java的Notebook源码,Java记事本.zip

    标题中的“基于java的Notebook源码,Java记事本.zip”表明这是一个使用Java编程语言开发的记事本应用程序的源代码。这个记事本程序可能是为了教学、学习或者实践目的而创建的,它展示了如何在Java环境中实现一个基本...

    基于javatcpsocket通信的拆包和装包源码-coding-guide_i3geek-master:编码指南_i3geek-master

    一名JAVA程序员,将自己的编程学习之路做以总结并进行分享。内容包括但不限于数据结构、算法、数据库、操作系统、计算机网络等多方面。 目前先暂列目录,内容在逐渐增加中 JAVA 关键字 void byte int long char ...

    Java 字符串与文本相关实例源码

    在Java编程语言中,字符串(String)是至关重要的数据类型,用于处理文本信息。字符串是不可变的,这意味着一旦创建,就不能更改其内容。本实例源码集主要关注Java中的字符串和文本处理,提供了多种实际应用的示例,...

    疯狂java讲义全部源码

    - **StringBuilder与StringBuffer**:线程安全与非线程安全的字符串操作类。 5. **集合框架** - **List接口**:ArrayList和LinkedList的实现,增删查改操作,迭代器的使用。 - **Set接口**:HashSet、TreeSet的...

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

    8. **字符串处理**:`java.lang.String`是不可变对象,其源码中有很多优化技巧,如`StringBuilder`和`StringBuffer`在字符串拼接时的性能差异。 9. **网络编程**:`java.net`包提供了网络通信的功能,包括套接字...

    JAVA趣味学习

    7. **字符串处理**:String类在Java中广泛使用,理解它的不可变性、方法如concat、substring、indexOf等,以及StringBuilder和StringBuffer的使用,对编写高效代码非常重要。 8. **函数式编程**:Java 8引入了...

    java记事本(源码)

    - **String和StringBuilder/StringBuffer**:处理和构建文本字符串。 - **正则表达式**:可能用于搜索和替换功能,实现复杂的文本匹配。 5. **事件处理**: - **EventObject和EventListener**:Java事件模型的...

    JAVA案例集合源码

    - StringBuilder与StringBuffer:在需要频繁修改字符串时,这两个类比String更高效。 3. **数组与集合**: - 数组:Java提供了单列和多列数组,源码中可能有对数组的初始化、遍历、排序等操作。 - 集合框架:...

Global site tag (gtag.js) - Google Analytics