String,StringBuffer,StringBuilder有什么区别呢?
大多数面试官会问道这样的一道基础面试题。
区别
- String是Java语言非常基础也是非常重要的类,提供了构造器和和管理字符串的各种逻辑,它是典型的Immutable类(Immutable是Java的一种不可变类机制),所有的属性都是不可变的(final关键字修饰)。也由于不可变性:类似拼接、裁剪等字符串操作都会产生新的String对象。所有效率低
- StringBuffer的出现正是为了解决String产生的问题(产生新的String对象)而提供的一个类,我们可以利用append或者add方法,把字符串添加到已有序列的末尾或者指定位置。StringBuffer本质是一个线程安全的可修改的字符串序列,为了保证线程安全,也带来了额外的性能开销。
- StringBuilder是Java1.5新增的,在能力上和StringBuffer没有区别,但是去掉了线程安全的部分,减小了开销。
名称 | 可变性 | 安全 | 性能效率 |
---|---|---|---|
String | final 不可变 | 安全 | 字符串操作产生新的String对象,效率低 |
StringBuffer | 可变 | 安全 | 有额外的开销维护线程安全,性能开销相对大 |
StringBuilder | 可变 | 不安全 | 性能开销小,效率高 |
其他
- 什么是Immutable?
- Immutable不可变的。所以天生线程安全。由于不可变在拷贝的时候不需要额外的复制数据
- StringBuffer为什么线程安全
- StringBuffer通过把各种修改数据的方法都加上了synchronized关键字。
- StringBuffer和StringBuilder为什么可以修改字符串序列?
- StringBuffer和StringBuilder都继承了AbstractStringBuilder(里面包含了基本操作,区别是否加入synchronized)
- 底层都是利用可修改的数组(char,JDK9是byte),默认大小是字符串长度16
题外话:谢谢大家观看,有不足之处欢迎大家一起讨论;码字不易,大家喜欢,麻烦点赞哦。
灵魂三问:
- 有没有觉得技术得不到系统的提升,技术成长慢?
- 有没面试懵逼,升职加薪难?
- 有没有想过去大一点的世界看看?
有期望JAVA技术巩固的、Android知识进阶的、期望升职加薪的、Android面试技巧的、大厂面试真题的;大家可以加我QQ哦:1070800492。我们一起学习,一起进步!
重要的事情说三遍:
- 学习、挣钱、自由
- 学习、挣钱、自由
- 学习、挣钱、自由
疫情当下,唯有自强