[Java开发之路](4)String、StringBuffer与StringBuilder详解

简介:
最近学习到字符串,整理了一下String,StringBuffer,StringBuilder相关知识

1. String

String 类位于 java.lang 包中。 String 对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。
 
 
String str1 = "xiaosi";
str1 = "欢迎你 " + str1;
System.out.println(str1); // 欢迎你 xiaosi
通过观察运行结果可以看见str1变量输出确实改变了,但是为什么一直说String对象是不可变的呢? 我们其实被表象给欺骗了,JVM是这样解析这段代码的:首先创建对象str1,赋予xiaosi,然后再创建一个新的对象用来执行第二行代码,str1指向了这个新对象,原对象没有发生改变,由于这种机制,每当用String操作字符串时,实际上是在不断的创建新对象,而原来的对象就会变为垃圾被GC回收掉。



这样做是否会降低运行效率呢?看起来好像修改一个代码单元要比创建一个新字符串更加简洁。答案是:也对,也不对。通过拼接"欢迎你"和"xiaosi"来创建一个新字符串的效率确实不高。但是,不可变字符却有一个有点: 编译器可以让字符串达到共享

为了弄清楚具体的工作方式,可以想象将各种字符串放入公共的字符串存储池中,字符串变量指向字符串存储池中相应位置。如果复制一个字符串变量,原始字符串与复制的字符串变量共享相同的字符。

Java设计者认为 共享带来的高效率远远胜于提取,拼接字符串所带来的低效率。查看一下程序你就会发现: 很少需要修改字符串,而是往往需要对字符串进行比较

2. StringBuffer

String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据。 String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。
 
  
// 创建一个空的StringBuffer类的对象。
public StringBuffer()
// 创建一个长度为 参数length 的StringBuffer类的对象。
public StringBuffer( int length )
其是 线程安全的可变字符序列。一个类似于 String 的字符串缓冲区。可将字符串缓冲区安全地用于 多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

每个字符串缓冲区都有一定的 容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。

3. StringBuilder

从 JDK 5 开始,为该类补充了一个 单个线程使用的等价类,即 StringBuilder。StringBuffer和StringBuilder类功能基本相似,主要区别在于StringBuffer类的方法是 多线程、安全的,而 StringBuilder不是线程安全的。 与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 对于经常要改变值的字符串应该使用 StringBuffer和StringBuilder类。

4. 总结

(1)一般情况下,速度从快到慢:StringBuilder > StringBuffer > String,这种比较是相对的,不是绝对的。 
(2)当字符串缓冲被多个线程使用时,JVM不能保证StringBuilder的操作是安全的,虽然速度快,但是StringBuffer是可以保证是正确操作的。大多数情况下是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的。

















目录
相关文章
|
11天前
|
安全 Java
Java基础之StringBuffer
【7月更文挑战第1天】 Java中的`StringBuffer`是线程安全的字符串操作类,适合多线程环境,而`StringBuilder`非线程安全,速度更快,适用于单线程。两者提供`append()`、`insert()`、`delete()`等方法修改字符串,避免了频繁创建新对象的性能问题。在不需要线程安全时,推荐使用`StringBuilder`以提高效率。
12 1
|
12天前
|
安全 Java 索引
带你快速掌握Java中的String类和StringBuffer类(详解常用方法 | 区别 )
带你快速掌握Java中的String类和StringBuffer类(详解常用方法 | 区别 )
|
19天前
|
存储 缓存 Java
JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解
JavaSE 字符串String及相关API StringBuilder StringJoiner 底层原理 详解
18 2
|
19天前
|
Java 数据处理 Apache
探讨Java中判断String类型为空和null的方法
探讨Java中判断String类型为空和null的方法
14 1
|
11天前
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
13 0
|
16天前
|
存储 Java API
Java基础之String类
Java的String类是引用类型,用于创建和操作字符串。字符串对象在`java.lang`包中,不可变。创建方式包括字面量和`new`关键字。字符串池存储字符串常量,避免重复。比较字符串用`equals()`(区分大小写)和`equalsIgnoreCase()`(不区分大小写)。`length()`返回长度,`concat()`或`+`拼接,`substring()`截取,`indexOf()`和`lastIndexOf()`查找,`replace()`替换,`split()`分割。这些是常用的字符串API。
10 0
|
16天前
|
Java
Java基础之String类
Java基础之String类
13 0
|
19天前
|
存储 缓存 安全
java源码之String详解
java源码之String详解
15 0
|
2月前
|
安全 Java
Java StringBuffer 和 StringBuilder 类
Java StringBuffer 和 StringBuilder 类
26 0
|
2月前
|
存储 XML 缓存
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
37 0