Java 核心技术 36 讲学习笔记五

这是我学习极客时间 app 中《Java核心技术36讲》课程的第 5 篇学习笔记,坚持写完 36 讲学习笔记。

1. 问题

String、StringBuffer、StringBuilder 有什么区别?

2. 典型回答

String

String 是典型的 immutable(不可变的)类,被声明为 final Class 并且所有属性也都是 final 的,由于它的不可变性,类似拼接、截取字符串等操作,都会产生新的 String 对象。

StringBuffer

为了解决 Spring 拼接等操作产生大量中间对象而提供的一个类。String Buffer 是线程安全的,但带来了额外的性能开销。

StringBuilder

StringBuilder 在能力上与 StringBuffer 没有本质区别,但是它去掉了线程安全部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选。

一句话总结,String 不可变类,StringBuffer 线程安全,StringBuilder 线程不安全。

3. 扩展

1.StringBuffer 线程安全的实现方法?

StringBuffer 的线程安全是通过把各种修改数据的方法都加上 synchronized 关键字实现的,非常简单粗暴。

2.StringBuffer 和 StringBuilder 是如何实现修改字符序列的?

底层都是利用可修改的(char,JDK 9 以后是 byte)数组,二者都继承了 AbstractStringBuilder,里面包含了基本操作,区别仅在于最终的方法是否加了 synchronized。

3.这个内部数组应该创建多大呢?

初始字符串长度加 16,如果我们确定拼接会发生非常多次,而且大概是可以预计的,那么就可以指定合适的大小,避免很多次扩容的开销。扩容会产生开销,因为要抛弃原有数组,创建新的数组,还要进行 arraycopy。

4.编译与反编译

编译

反编译

5.Dump Heap

java程序性能分析之thread dump和heap dump

6.字符串缓存

jdk 6 以后提供了 intern()方法,目的是提示 JVM 把相应字符串缓存起来,以备重复使用。在我们创建字符串对象并调用 intern() 方法的时候,如果已经有缓存的字符串,就会返回缓存里的实例,否则将其缓存起来。JDK 8u20 以后,推出了新特性 G1 GC 下的字符串排重。它是通过将相同数据的字符串指向同一份数据来做到的,是 JVM 底层的改变,并不需要 Java 类库做什么修改。

4.总结

一句话总结,String 不可变类,StringBuffer 线程安全,StringBuilder 线程不安全。

5.参考文档

《Java 核心技术 36 讲》

信息爆炸,我们来筛

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180616G15EDX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注腾讯云开发者

领取腾讯云代金券