title: SpringSecurity 认知
date: 2021-04-06 17:36:04
tags: 面试题
Java 根底
String、StringBuffer、StringBuilder 的区别?
从 线程平安、执行效率、存储空间、应用场景来阐明
- 从线程安全性来说:String、StringBuffer 是线程平安的,StringBuilder 是非线程平安的。
- 从执行效率来说:StringBuilder > StringBuffer > String。
- 从存储空间来说:String 的值是不可变的,每次对 String 的操作都会生成新的 String 对象,效率低消耗大量内存空间,从而引起 GC。StringBuffer 和 StringBuilde r 都是可变的。
- 从应用场景来阐明:①如果要操作大量的数据用 String;②单线程操作字符串缓冲区 下操作大量数据用 StringBuilder③多线程操作字符串缓冲区下操作大量数据用 StringBuffer。
源码如下
//String
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {private final char value[]; // 底层是字符数组,定长,final 不可变
}
//StringBuffer
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{private transient char[] toStringCache;
public StringBuffer() { super(16);} // 字符数组长度默认为 16
public StringBuffer(int capacity) {super(capacity);}
public StringBuffer(String str) {super(str.length() + 16);
append(str);
}
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}
}
--StringBuilder
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence{public StringBuilder() {super(16);} // 字符数组长度默认为 16
@Override
public StringBuilder append(String str) {super.append(str);
return this;
}
}
--AbstractStringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {char[] value; // 默认字符数组
public AbstractStringBuilder append(Object obj) {return append(String.valueOf(obj));
}
}
讲述 HashMap 的源码