Java 突击 —— 字符串

1 概述

字符串是常用的数据类型。在 Java 中,常见的字符串类型包括 StringStringBufferStringBuilder


2 String

String 的源码可以看到,String 使用数组存储字符串的内容,数组使用关键词 final 修饰,因此数组内容不可变,使用 String 定义的字符串的值也是不可变的。

由于 String 类型的值不可变,因此每次对 String 的修改操作都会创建新的 String 对象,导致效率低下且占用大量内存空间。


3 StringBuffer 和 StringBuilder

StringBufferStringBuilder 都是 AbstractStringBuilder 的子类,同样使用数组存储字符串的内容,由于数组没有使用关键词 final 修饰,因此数组内容可变,StringBufferStringBuilder 都是可变类型,可以对字符串的内容进行修改,且不会因为修改而创建新的对象。

在需要经常对字符串的内容进行修改的情况下,应使用 StringBufferStringBuilder,在时间和空间方面都显著优于 String

StringBufferStringBuilder 有哪些区别呢?从源码可以看到,StringBuffer 对定义的方法或者调用的方法使用了关键词 synchronized 修饰,而 StringBuilder 的方法没有使用关键词 synchronized 修饰。由于 StringBuffer 对方法加了同步锁,因此其效率略低于 StringBuilder,但是在多线程的环境下,StringBuilder 不能保证线程安全,因此 StringBuffer 是更优的选择。

4 总结

  • String 是不可变类型,每次对 String 的修改操作都会创建新的 String 对象,导致效率低下且占用大量内存空间,因此 String 适用于字符串常量的情形,不适合需要对字符串进行大量修改的情形。

  • StringBuffer 是可变类型,可以修改字符串的内容且不会创建新的对象,且 StringBuffer 是线程安全的,适用于多线程环境。

  • StringBuilder 是可变类型,与 StringBuffer 相似,在单线程环境下 StringBuilder 的效率略高于 StringBuffer,但是在多线程环境下 StringBuilder 不保证线程安全,因此 StringBuilder 不适合多线程环境。

5 问题

  1. String 类型的值是否可变?对 String 类型的值进行修改操作是否修改了 String 的内容?
  • 由于 String 的源码中,存储字符串内容的数组使用关键词 final 修饰,因此 String 类型的值不可变。对 String 类型的值进行修改,没有修改 String 的内容,而是创建了新的 String 对象。
  1. StringBufferStringBuilder 哪一种类型的效率更高?两种类型分别适用于什么样的场合?
  • StringBuilder 的效率更高,因为 StringBuffer 对方法加了同步锁,而 StringBuilder 没有对方法加同步锁。虽然 StringBuilder 的效率更高,但是因为没有对方法加同步锁,因此在多线程环境下不保证线程安全,只适合单线程环境,而 StringBuffer 可以用于多线程环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值