【Java】String、StringBuilder与StringBuffer
2016-09-28 11:59
429 查看
String 字符串常量
StringBuilder 字符串变量(字符数组),非线程安全
StringBuffer 字符串变量(字符数组),线程安全
String中的字符数组
线程安全
String是不可变的,字符串常量,所以String是线程安全的。
拼接
加号拼接
Java没有运算符重载,编译的时候检测到
编译器则会转换成(避免了多次创建String对象作为中间量,但是用完就直接变成垃圾了)
还有一种情况:
编译器则直接转换成
concat()方法
在字符串的尾部拼接指定的字符串。
可指定字符数组长度
线程安全
线程安全,方法都用关键字
toStringCache
在任何修改字符串的方法执行前,都将该变量设为null。当调用toString()方法时,返回该缓存,如果该缓存为空,则将
可指定字符数组长度
跟StringBuffer一致
线程不安全
是轻量级StringBuffer,没有实现线程同步,效率更高,因为锁的获取和释放会带来开销。
StringBuffer中没有加锁,而且也没有请toStringCache,还没搞懂。。。
StringBuilder 字符串变量(字符数组),非线程安全
StringBuffer 字符串变量(字符数组),线程安全
String
不可变常量private final char value[];
String中的字符数组
value[]定义为
final,所以String是不可变的。
线程安全
String是不可变的,字符串常量,所以String是线程安全的。
拼接
加号拼接
Java没有运算符重载,编译的时候检测到
+号拼接字符串,则编译器将用StringBuilder代替。
String str1 = "a";
String str2 = "b";
String str3 = "c";
String str = str1 + str2 + str3;
编译器则会转换成(避免了多次创建String对象作为中间量,但是用完就直接变成垃圾了)
String str = new StringBuilder(str1).append(str2).append(str3);
还有一种情况:
String str = "a" + "b" + "c";
编译器则直接转换成
String str = "abc";
concat()方法
在字符串的尾部拼接指定的字符串。
public String concat(String str) { int otherLen = str.length(); //如果指定字符串长度为0,则直接返回字符串本身。 if (otherLen == 0) { return this; } int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen); //将str copy到buf[]字符数组后,并由buf[]创建新的String对象返回 str.getChars(buf, len); return new String(buf, true); } void getChars(char dst[], int dstBegin) { System.arraycopy(value, 0, dst, dstBegin, value.length); } public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
StringBuffer
可变字符串char[] value;
可指定字符数组长度
public StringBuffer(int capacity) { super(capacity); } //初始长度为16 public StringBuffer() { super(16); } public StringBuffer(String str) { super(str.length() + 16); append(str); }
线程安全
线程安全,方法都用关键字
synchronized修饰。
toStringCache
private transient char[] toStringCache;
在任何修改字符串的方法执行前,都将该变量设为null。当调用toString()方法时,返回该缓存,如果该缓存为空,则将
valuecopy到该数组中。toString()方法返回的是这个数组创建的字符串。StringBuilder没有这个变量,这样子设计,可能是因为 StringBuilder 一般不会在多线程环境中使用,所以不太可能出现连接多次调用 StringBuilder.toString(),因此没有必要共享。
StringBuilder
可变字符串char[] value;
可指定字符数组长度
跟StringBuffer一致
线程不安全
是轻量级StringBuffer,没有实现线程同步,效率更高,因为锁的获取和释放会带来开销。
问题 mark
public StringBuffer insert(int dstOffset, CharSequence s)
StringBuffer中没有加锁,而且也没有请toStringCache,还没搞懂。。。
相关文章推荐
- Java 中的字符串类String、StringBuffer、StringBuilder的区别
- JAVA中String与StringBuffer,StringBuilder应用的区别
- Java String,StringBuilder,StringBuffer
- 理解java String,深入解析StringBuffer和StringBuilder的区别
- 黑马程序员---------笔记整理(java基础九-----String,StringBuffer,StringBuilder)
- JAVA中String与StringBuffer 、StringBuilder的区别
- JAVA中String与StringBuffer 、StringBuilder的区别
- 【Java学习笔记】Day 3 String及StringBuilder及StringBuffer 【待整理】
- 黑马程序员 _Java中的String、StringBuffer、StringBuilder
- Java String StringBuffer StringBuilder比较
- Java 中的字符串类String、StringBuffer、StringBuilder的区别
- Java 中的字符串类String、StringBuffer、StringBuilder
- Java中String、StringBuilder和StringBuffer的区别
- JAVA中String、StringBuffer、StringBuilder的区别
- Java高效运行必备:如何选择使用String、StringBuffer与StringBuilder
- day7 常用类字符串处理类--String、StringBuffer、StringBuilder 自动装箱、拆箱 Object类 Java 的异常处理机制
- Java中String,StringBuilder和StringBuffer的区别
- java中的String,StringBuffer和StringBuilder
- Java中的字符串 String, StringBuffer和StringBuilder
- 【java面试题】StringBuilder与StringBuffer和String 的区别