String,StringBuffer,StringBuilder 的区别【大白话Java面试题】
- 大白话回答
1、可变/不可变类
String是不可变类。他被被final修饰,所以每一次的创建修改删除都要重新分配内存创建新的对象。
StringBuilder和StringBuffer是可变类,修改以及追加都不会创建新的对象。
2、线程安全性
String被final修饰是线程安全的
StringBuffer使用了同步锁是线程安全的
StringBuilder是线程不安全的
3、存储位置
String存储在字符串常量池 中
StringBuilder和StringBuffer存放在堆中。
4、效率上
String < StringBuffer < StringBuilder
- 详细描述
String
String是把数据存放在了字符串常量池中,所有的String都是常量的方式来保存的,并且它是被final修饰的所以是线程安全的。每一个String对象在被创建好后就不会再发生任何改变,如果进行值的重新指向,会在池中寻找或者创建一个新的对象。
他是支持查找不支持修改的,所以执行效率最低。 适合使用在少量字符串操作的情况下。
StringBuilder
StringBuilder是执行效率最高的,底层和StringBuffer一样通过char[]数组来实现,支持查询修改操作,效率高但是不安全
不安全:
在进行多线程处理的时候,多个线程对同一个变量进行修改查询操作的时候会出现数据的混乱,执行错误逻辑,它没有对线程安全进行考虑,是线程不安全的。
适合使用在单线程大象字符串操作情况下。
StringBuffer
StringBuffer效率虽然没有StringBuilder高,但是比String效率高的多。 效率低的原因:
在考虑线程安全的情况下,在进行字符串操作的时候使用了 synchronized 关键字的进行加锁操作来保证线程的安全性。
适合使用在多线程对多字符串操作的情况下。
字符串常量池的简介
字符串常量池又称为:字符串池,全局字符串池,英文也叫String Pool。 在工作中,String类是我们使用频率非常高的一种对象类型。JVM为了提升性能和减少内存开销,避免字符串的重复创建,其维护了一块特殊的内存空间,这就是我们今天要讨论的核心:字符串常量池。字符串常量池由String类私有的维护。
JDK7之前字符串常量池是在永久代里边的,但是在JDK7之后,把字符串常量池分进了堆里边