String
String 是 Java 中处理字符串相关业务的基础类。
它是典型的不可变类(Immutable):被声明为 final class,内部属性也是 final。
“不可变”的特性可以为线程安全提供便利,拷贝时也不需要额外复制数据(构造函数 String(String) 就是直接设置内部字段的引用,未拷贝数据)。
【性能】
- 因为“不可变”,所以字符串的拼接、裁剪等操作会产生新的 String 对象。如果处理不当,会对性能产生明显影响。
StringBuffer
该类可以避免字符串拼接过程中产生太多中间对象。通过它的 append 方法就可以实现字符串拼接。
【性能】
- 该类继承自 AbstractStringBuilder,用数组作为内部容器。如果拼接操作较多且最终字符串长度可预测,可先指定容量,再执行拼接,以减少扩容的开销。
- 该类使用内建的 synchronized 关键字实现了线程安全。但对于非多线程场景,这种同步开销又是多余的。
StringBuilder
该类也用于字符串拼接。与 StringBuffer 没有本质区别。但是该类去掉了对线程安全的处理,没有相关开销。
该类适用于非多线程场景,也是绝大部分情况下进行字符串拼接的首选。
【性能】
- 该类也继承自 AbstractStringBuilder。可先指定容量,再执行拼接,以减少扩容的开销。
其它
内部数组类型
在 Java 8 及以前,AbstractStringBuilder 的内部数组是 char[]。
这种类型简单直观:字符串就是多个字符组成的。但一个 char 由两个 byte 组成,拉丁语系字符不需要这么大的空间。
为了使数据更紧凑,减少开销,Java 9 中这个内部数组是 byte[],用字段 coder 来表示编码类型。
这种改动会导致同样的内部数组长度(capacity)可存储的字符个数减少。但总体而言,新类型的内存占用更小,操作速度更快。
字符串排重
谨慎使用 intern() 方法
intern() 方法可以将字符串添加到 JVM 的字符串常量池中。如果池中已存在相等(equals)的字符串,则直接返回已有字符串的引用。
这是 显式排重机制。
但是显式调用很麻烦,又污染代码。因为开发阶段很难预计字符串重复情况,很难有良好的效率收益。
JDK8u20 之后,G1 GC 支持通过 -XX;+UseStringDeduplication 开启字符串排重特性。数据相同的字符串就会指向同一份数据。
不要使用 getBytes() 方法
不指定编码时,会使用系统默认编码对 String 编码。这种不确定性会挖坑。
推荐显式指定编码的方法:getBytes(String charsetName)、getBytes(Charset charset)
相关推荐
在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、StringBuffer和StringBuilder进行深入分析,了解它们之间...
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...
String:字符串常量 StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段...
在Java编程语言中,`StringBuffer`和`StringBuilder`是两个非常重要的类,它们主要用于处理字符串的拼接和修改操作。这两个类位于`java.lang`包下,因此在使用时无需显式导入。本篇文章将深入探讨这两个类的特性和...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...
在字符串连接操作中,StringBuffer 的效率要比 String 高。例如,String str = new String("welcome to ");str += "here";的处理步骤实际上是通过建立一个 StringBuffer,让它调用 append(),最后再将 StringBuffer ...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...
在Java编程语言中,删除字符串中的特定字符是一项常见的任务,特别是在处理用户输入或者文本数据时。这个实例将向我们展示如何实现这一功能。通过提供的详细教程和源代码,我们可以深入理解这一过程。以下是对该主题...
在Java编程语言中,String和StringBuilder是两个非常重要的类,它们在处理文本字符串时起着核心作用。了解这两个类的特点和使用场景对于提高程序性能至关重要。 首先,`String`类在Java中是不可变的,这意味着一旦...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的对象,但它们之间存在显著的区别。String是最常见的字符串类型,它的特点是不可变性。这意味着一旦一个String对象被创建,就不能进行...
为了解决这个问题,Java提供了`StringBuffer`和`StringBuilder`类,它们允许我们高效地修改字符串。 #### 2. StringBuffer类的使用 - **构造方法**: - `public StringBuffer()` - 创建一个空的`StringBuffer`。...
String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的类,但它们之间存在显著的性能和功能差异。下面我们将深入探讨这三个类的区别。 首先,`String`类是Java中最基本的字符串类型,它表示...
Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别是很多开发者经常混淆或不了解的知识点。今天,我们将深入探讨这三种字符串类型的区别和用法。 首先,让我们从 String 类型开始。String 类型...
本教程将深入探讨如何在Java中实现字符串反转,包括基础方法和一些高级技巧。我们将通过源代码实例来详细讲解,以帮助你更好地理解和应用这些知识。 首先,Java中的字符串是不可变对象,这意味着一旦创建了一个字符...
Java中的String、StringBuilder和StringBuffer类都是用于处理字符串的,但在不同的场景下,它们各有优缺点。本篇文章将深入分析这三个类的区别。 首先,我们来看它们的值可变性。String类是不可变的,这意味着一旦...
在Java编程语言中,字符串(String)是至关重要的数据类型,用于存储和操作文本。字符串类提供了丰富的API,使得处理字符串变得高效且灵活。本篇将深入探讨Java中的字符串、正则表达式及其在实际编程中的详细实例代码...
Java中的字符串处理是编程中常见的任务,涉及到三个关键类:String、StringBuffer和StringBuilder。它们在功能上相似,但有着重要的区别,主要体现在字符串的可变性、线程安全性和性能方面。 1. 可变性 - String类...
对于大量字符串操作,`StringBuilder`和`StringBuffer`类比`String`更高效,因为它们支持可变操作。在多线程环境下,`StringBuffer`是线程安全的选择,而`StringBuilder`则在单线程环境中更快。 5. **Pattern与...