说来惭愧,用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的区别 在本文中,我们将从源码角度分析StringBuffer和StringBuilder的区别,这两个类都是Java中常用的字符串操作类,但是它们之间有什么区别呢?下面我们来...
在`String`的源码中,可以学习到如何设计一个高效且安全的不可变类。 总的来说,`String`类是Java开发中不可或缺的一部分,理解和掌握其特性和方法对于编写高质量的代码至关重要。通过深入研究源码,我们能更深入地...
String、StringBuilder、StringBuffer 都是 Java 中的字符串类,但是它们有不同的设计目标和使用场景: * String 类是不可变的,适合读取操作。 * StringBuilder 类是可变的,适合大量字符串拼接操作。 * ...
jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...
【标题】"java源码:Notebook源码,Java记事本.rar" 是一个Java编程的项目,其中包含了实现一个简单记事本应用的源代码。这个应用可能提供了基本的文字编辑功能,如新建、打开、保存、复制、粘贴、剪切、查找和替换...
一名JAVA程序员,将自己的编程学习之路做以总结并进行分享。内容包括但不限于数据结构、算法、数据库、操作系统、计算机网络等多方面。 博文: 目前先暂列目录,内容在逐渐增加中 JAVA 关键字 void byte int long ...
在分析`StringBuffer`的源码时,可以学习到其内部如何实现线程安全的字符串操作,例如如何管理字符数组的大小以及在添加、删除和替换操作时如何进行同步控制。通过阅读源码,开发者可以深入理解Java的内存管理和多...
"Java学习资料&项目源码,java基础se的课堂代码练习"这个标题表明这是一个关于Java Standard Edition (SE)的基础学习资源,包含了实际的课堂代码练习,帮助初学者深入理解和掌握Java编程。 在Java SE中,学习者将...
Java2全方位学习书源码包含了丰富的Java编程实例,旨在帮助初学者深入理解Java语言的核心概念和技术。这本书籍通过实例教学的方式,将理论与实践相结合,让读者能够更好地掌握编程技能。下面,我们将从多个方面详细...
5. **字符串处理**:String类在Java中扮演着重要角色,学习其不可变性、常用方法以及StringBuilder和StringBuffer的使用是必要的。 接下来,进阶话题: 6. **集合框架**:List、Set和Map接口以及ArrayList、...
总结来说,Java字符串格式化是构建和展示文本信息的关键技术,包括使用`String.format()`和`printf()`方法,以及`StringBuilder`和`StringBuffer`类。同时,理解并处理GBK这样的特定字符编码对于处理中文字符至关...
标题中的“基于java的Notebook源码,Java记事本.zip”表明这是一个使用Java编程语言开发的记事本应用程序的源代码。这个记事本程序可能是为了教学、学习或者实践目的而创建的,它展示了如何在Java环境中实现一个基本...
一名JAVA程序员,将自己的编程学习之路做以总结并进行分享。内容包括但不限于数据结构、算法、数据库、操作系统、计算机网络等多方面。 目前先暂列目录,内容在逐渐增加中 JAVA 关键字 void byte int long char ...
在Java编程语言中,字符串(String)是至关重要的数据类型,用于处理文本信息。字符串是不可变的,这意味着一旦创建,就不能更改其内容。本实例源码集主要关注Java中的字符串和文本处理,提供了多种实际应用的示例,...
- **StringBuilder与StringBuffer**:线程安全与非线程安全的字符串操作类。 5. **集合框架** - **List接口**:ArrayList和LinkedList的实现,增删查改操作,迭代器的使用。 - **Set接口**:HashSet、TreeSet的...
8. **字符串处理**:`java.lang.String`是不可变对象,其源码中有很多优化技巧,如`StringBuilder`和`StringBuffer`在字符串拼接时的性能差异。 9. **网络编程**:`java.net`包提供了网络通信的功能,包括套接字...
7. **字符串处理**:String类在Java中广泛使用,理解它的不可变性、方法如concat、substring、indexOf等,以及StringBuilder和StringBuffer的使用,对编写高效代码非常重要。 8. **函数式编程**:Java 8引入了...
- **String和StringBuilder/StringBuffer**:处理和构建文本字符串。 - **正则表达式**:可能用于搜索和替换功能,实现复杂的文本匹配。 5. **事件处理**: - **EventObject和EventListener**:Java事件模型的...
- StringBuilder与StringBuffer:在需要频繁修改字符串时,这两个类比String更高效。 3. **数组与集合**: - 数组:Java提供了单列和多列数组,源码中可能有对数组的初始化、遍历、排序等操作。 - 集合框架:...