Java基础
数据类型
自动装箱
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
int y = x; // 拆箱 调用了 X.intValue()
缓存池
new Integer(123) 与 Integer.valueOf(123) 的区别在于:
- new Integer(123) 每次都会新建一个对象;
- Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
自动装箱过程中会自动调用 valueOf()
Java8 中基本类型对应的缓冲池如下
- boolean values true and false
- all byte values
- short values between -128 and 127
- int values between -128 and 127
- char in the range \u0000 to \u007F
String
String 被声明为 final ,因此它不可被继承。且不可变
//Java8 中 String 声明
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
private final char value[];
}
//Java9 中改用 byte 数组存储,同时使用 coder 表明使用哪种编码
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final byte[] value;
/** The identifier of the encoding used to encode the bytes in {@code value}. */
private final byte coder;
}
不可变好处:
- 线程安全
- 安全性好
- 可以缓存 hash 值
- String pool 的需要
String, StringBuffer, StringBuilder 比较
- String, StringBuffer 线程安全 --》 StringBuffer 加了同步锁
- StringBuffer, StringBuilder 为可变字符串
- StringBuilder 性能稍微比 StringBuffer 好
String Pool
字符串常量池(String Pool)保存着所有字符