String、StringBuilder、StringBuffer
- 参考引用:String、StringBuilder、StringBuffer 的区别?
- 参考引用:Java 核心技术# 05 | String、StringBuffer、StringBuilder 有什么区别?
回答
- String 是不可变的,
- StringBuilder 和 StringBuffer 是可变的。
- StringBuffer 是线程安全的,
- StringBuilder 是非线程安全的。
扩展
1、String 的不可变性
- 参考: String 的不可变性
2、为什么设计成不可变的
- 参考:String 为什么设计成不可变的?
- 或者看这:https://blog.youkuaiyun.com/qq_25124863/article/details/146508955?spm=1001.2014.3001.5502
3、String 和 +
如何实现的?
- 示例代码
- 反编译如下
- Java 中的
+
对字符串的拼接,其实现原理是使用 StringBuilder.append
4、StringBuffer 和 StringBuilder
-
StringBuffer 类定义
-
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
-
-
value 和 count 定义
-
/** * The value is used for character storage. */ char[] value; /** * The count is the number of characters used. */ int count;
-
-
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; }
-
-
StringBuffer#append 定义
-
// StringBuffer#append @Override public synchronized StringBuffer append(Object obj) { toStringCache = null; super.append(String.valueOf(obj)); return this; }
-
-
StringBuffer 和 StringBuilder 最大的区别就是:StringBuffer 是线程安全的。
5、不要在 for 中,使用 +
来拼接 String
- 示例代码
- 反编译
- 频繁的新建对象,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。
From《阿里巴巴 Java 开发手册》建议:
在循环体内,字符串的连接方式。
使用 StringBuitder的 append 方法进行扩展。
而不要使用
+