[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的。

















目录
相关文章
|
1天前
|
Cloud Native 安全 Java
Java开发面试--nacos专区(二)
Java开发面试--nacos专区
7 0
|
1天前
|
存储 缓存 NoSQL
Java开发面试--Redis专区(二)
Java开发面试--Redis专区
6 0
|
1天前
|
存储 缓存 NoSQL
Java开发面试--Redis专区(一)
Java开发面试--Redis专区
7 0
|
1天前
|
存储 Java Nacos
Java开发面试--nacos专区(一)
Nacos是什么? 请简要介绍Nacos是什么以及它的主要功能和用途。
14 0
|
8天前
|
Java API 数据安全/隐私保护
Elasticsearch Java API Client 开发
本场景主要介绍如何使用 Elasticsearch Java API Client 进行开发,实现常用的 CRUD 操作。
32 0
|
11天前
|
人工智能 NoSQL Java
现在行情这么差?开发岗底薪不如销售?Java面试突击手册用不上了
这里求证一下合肥当地的小伙伴,该信息的真伪。以及其他地方是否也有这样的情况? 如果是真的,难道真的是因为收到AI的冲击?还是大学专业规划师们让计算机专业人才过于旺盛了?人越来越不值钱了?留言区一起聊聊吧~ 虽然近期情况真的不好,但是也真的有很多朋友都在求大厂面试题真题,我熬了3天,才终于把现阶段能找到的今年最新的面试题整理了
现在行情这么差?开发岗底薪不如销售?Java面试突击手册用不上了
|
14天前
|
运维 监控 数据可视化
Java开发面试总结tips
Java开发面试总结tips
22 0
|
14天前
|
Java 应用服务中间件 API
Java业务接与业务开发接口
Java业务接与业务开发接口
18 0
|
17天前
|
Java Android开发
eclipse开发和运行Java程序
eclipse开发和运行Java程序
20 0
|
18天前
|
消息中间件 Dubbo Java
阿里裁员就靠这166页精品Java面试手册成功逆袭java高级开发岗了
近期,肯定有很多小伙伴,投出去的简历HR基本上都是已读不回,甚至都没有任何回复,或者平台默认筛选,你的简历HR根本就看不到。 即使有些小伙伴简历通过,收到面试邀请了,结果被通知不用面试了; 还有些小伙伴,有面试机会了,甚至已经参加了面试,但是还是被刷下来了。
推荐文章
更多