本文共 2087 字,大约阅读时间需要 6 分钟。
【面试篇】Java中String、StringBuilder与StringBuffer的区别?
每天进步一点点!
在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。但String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。
因此引进了两个新的类-StringBuffer类和StringBuilder类来对这种变化的字符串进行处理。
与String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用的对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
- 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;}1234567891)判断拼接的字符串是不是 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;}12345678910112)拼接后的字符数组长度是否超过当前值,如果超过,进行扩容并复制。
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!