【面试篇】Java中String、StringBuilder与StringBuffer的区别?
发布日期:2021-06-29 15:33:58 浏览次数:3 分类:技术文章

本文共 2087 字,大约阅读时间需要 6 分钟。

【面试篇】Java中String、StringBuilder与StringBuffer的区别?

每天进步一点点!

在这里插入图片描述

在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。但String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。

因此引进了两个新的类-StringBuffer类和StringBuilder类来对这种变化的字符串进行处理。

与String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用的对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmahz15s-1606403306809)(C:\Users\lcz\AppData\Roaming\Typora\typora-user-images\image-20201126225133604.png)]

  • String:不可变的字符串序列
  • StringBuffer:可变的字符串序列、线程安全效率低
  • StringBuilder:可变的字符串序列、线程不安全效率高

补充知识:字符串的拼接操作

1: “+” 号操作符

String s1 = "hello";String s2 = "world";System.out.println(s1 + s2);

但实际上在编译的时候“+”是被替换成了StringBuilder里面的append方法。即

System.out.println((new StringBuilder(String.valueOf(s1))).append(s2).toString());

2: StringBuilder

StringBuilder中的append方法就是常用的字符串拼接方法。

SpringBuilder类中的append方法源码如下:

public StringBuilder append(String str) {
super.append(str); return this;}

这 3 行代码没啥可看的,可看的是父类 AbstractStringBuilder 的 append 方法:

public AbstractStringBuilder append(String str) {
if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this;}123456789

1)判断拼接的字符串是不是 null,如果是,当做字符串“null”来处理。appendNull 方法的源码如下:

private AbstractStringBuilder appendNull() {
int c = count; ensureCapacityInternal(c + 4); final char[] value = this.value; value[c++] = 'n'; value[c++] = 'u'; value[c++] = 'l'; value[c++] = 'l'; count = c; return this;}1234567891011

2)拼接后的字符数组长度是否超过当前值,如果超过,进行扩容并复制。ensureCapacityInternal 方法的源码如下:

private void ensureCapacityInternal(int minimumCapacity) {
// overflow-conscious code if (minimumCapacity - value.length > 0) {
value = Arrays.copyOf(value, newCapacity(minimumCapacity)); }}

3)将拼接的字符串 str 复制到目标数组 value 中。

str.getChars(0, len, value, count);

3.StringBuffer

StringBuffer相比较StringBuilder区别在于线程安全。

public synchronized StringBuffer append(String str) {
toStringCache = null; super.append(str); return this;}

StringBuffer 类的 append 方法比 StringBuilder 多了一个关键字 synchronized。

转载地址:https://codingchaozhang.blog.csdn.net/article/details/110209936 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【面试篇】Java对象的hashCode()相同,equals()一定为true吗?
下一篇:【面试篇】Java中==和equals的区别是什么?

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月27日 14时45分28秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章