没有合适的资源?快使用搜索试试~ 我知道了~
首页Java字符串处理:String、StringBuffer与StringBuilder的区别与选择
Java字符串处理:String、StringBuffer与StringBuilder的区别与选择
需积分: 0 0 下载量 76 浏览量
更新于2024-06-30
收藏 837KB PDF 举报
在Java编程中,字符串处理是基础且常见的任务。第5讲主要探讨的是Java中String、StringBuffer和StringBuilder这三个核心类的区别。String是Java中最基础的类,代表不可变的字符序列。它的实例一旦创建,其内容就不能改变,每次对字符串进行操作(如拼接)都会创建一个新的String对象,这可能导致性能上的开销。 StringBuffer的引入是为了缓解频繁字符串拼接导致的对象创建问题。它是线程安全的,这意味着在多线程环境下,对StringBuffer的操作不会相互干扰,但这种特性也带来了额外的同步开销。因此,如果在单线程环境中,StringBuilder通常是更好的选择,因为它更轻量级,性能更高。 StringBuilder是在Java 1.5版本中增加的,它与StringBuffer在功能上相似,但不提供线程安全。这意味着在单线程环境中,StringBuilder的性能优势更加显著,适合大量字符串操作。对于开发者来说,理解这些类的特点和使用场景至关重要,因为它直接影响到代码的效率和内存管理。 学习这些知识点有助于编写更高效、易于维护的代码,尤其是在处理大量字符串操作时。记住,String的不可变性使得它适用于那些不需要修改的场景,而线程安全和性能之间的权衡则需要根据具体应用环境来选择StringBuffer或StringBuilder。理解并灵活运用这些类是提高Java编程技能的重要部分。
资源详情
资源推荐
极客时间 | Java核心技术36讲
https://time.geekbang.org/column/article/7349[2018/7/6 10:26:18]
10: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V
13: ldc #6 // String My String:
15: invokevirtual #7 // Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
18: aload_1
19: invokevirtual #7 // Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: invokevirtual #8 // Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
而在 JDK 9 中,反编译的结果就非常简单了,片段是:
7: invokedynamic #4, 0 // InvokeDynamic #0:makeConcatWithConstants:
(Ljava/lang/String;)Ljava/lang/String;
你可以看到,在 JDK 8 中,字符串拼接操作会自动被 javac 转换为 StringBuilder 操作,而在 JDK
9 里面则是因为 Java 9 为了更加统一字符串操作优化,提供了 StringConcatFactory,作为一个统
一的入口。javac 自动生成的代码,虽然未必是最优化的,但普通场景也足够了,你可以酌情选
择。
2. 字符串缓存
我们粗略统计过,把常见应用进行堆转储(Dump Heap),然后分析对象组成,会发现平均 25%
的对象是字符串,并且其中约半数是重复的。如果能避免创建重复字符串,可以有效降低内存消耗
和对象创建开销。
String 在 Java 6 以后提供了 intern() 方法,目的是提示 JVM 把相应字符串缓存起来,以备重复使
用。在我们创建字符串对象并调用 intern() 方法的时候,如果已经有缓存的字符串,就会返回缓存
里的实例,否则将其缓存起来。一般来说,JVM 会将所有的类似“abc”这样的文本字符串,或者
字符串常量之类缓存起来。
看起来很不错是吧?但实际情况估计会让你大跌眼镜。一般使用 Java 6 这种历史版本,并不推荐
大量使用 intern,为什么呢?魔鬼存在于细节中,被缓存的字符串是存在所谓 PermGen 里的,也
就是臭名昭著的“永久代”,这个空间是很有限的,也基本不会被 FullGC 之外的垃圾收集照顾
到。所以,如果使用不当,OOM 就会光顾。
在后续版本中,这个缓存被放置在堆中,这样就极大避免了永久代占满的问题,甚至永久代在 JDK
8 中被 MetaSpace(元数据区)替代了。而且,默认缓存大小也在不断地扩大中,从最初的
1009,到 7u40 以后被修改为 60013。你可以使用下面的参数直接打印具体数字,可以拿自己的
剩余16页未读,继续阅读
LauraKuang
- 粉丝: 22
- 资源: 334
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- zlib-1.2.12压缩包解析与技术要点
- 微信小程序滑动选项卡源码模版发布
- Unity虚拟人物唇同步插件Oculus Lipsync介绍
- Nginx 1.18.0版本WinSW自动安装与管理指南
- Java Swing和JDBC实现的ATM系统源码解析
- 掌握Spark Streaming与Maven集成的分布式大数据处理
- 深入学习推荐系统:教程、案例与项目实践
- Web开发者必备的取色工具软件介绍
- C语言实现李春葆数据结构实验程序
- 超市管理系统开发:asp+SQL Server 2005实战
- Redis伪集群搭建教程与实践
- 掌握网络活动细节:Wireshark v3.6.3网络嗅探工具详解
- 全面掌握美赛:建模、分析与编程实现教程
- Java图书馆系统完整项目源码及SQL文件解析
- PCtoLCD2002软件:高效图片和字符取模转换
- Java开发的体育赛事在线购票系统源码分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功