Java 基础
8 种基础数据类型
缓存范围的包装类,在 VM options 加入参数-XX:AutoBoxCacheMax=7777
,即可设置最大缓存值为 7777。
char 能存储中文字符吗
在 Java 中,char 类型占 2 个字节,而且 Java 默认采用 Unicode 编码,一个 Unicode 码是 16 位,所以一个 Unicode 码占两个字节,Java 中无论汉字还是英文字母都是用 Unicode 编码来表示的。所以,在Java中,char 类型变量可以存储一个中文汉字。
浮点数
单精度浮点数格式:
字符集
GB2312 收录 6763 个常用汉字;GBK 的 K 是扩展的意思,支持繁体,兼容 GB2312;GB18030 是国家标准,是 GBK 的超集并与之兼容;1994 年公布的 Unicode,编码格式有:UTF-8、UTF-16、UTF-32,UTF 可以理解为对 Unicode 的压缩方式。
访问权限
内部类和静态内部类
内部类有对外层类完全的访问权限。静态内部类没有一个指向嵌套类的引用,所以静态内部类不能够调用外层类的非静态方法,或者访问非静态的字段。
泛型
为什么类型擦除
为了兼容 JDK 5 之前(有泛型功能之前)的项目,否则有大量代码修改的工作。
//编译器的代码
Node node = new Node<String>();
//编译后的代码
Node node = new Node();
反射
Class.forName 和 ClassLoader
Class.forName 内部也是调用的 ClassLoader,只是调用 forName0
的第二个参数设置为了 true
,这个参数的含义是是否对加载的类进行初始化,会执行类里面的静态代码块:
@CallerSensitive
public static Class<?> forName(String className)
throws ClassNotFoundException {
Class<?> caller = Reflection.getCallerClass();
return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}
单例
饿汉模式 - 立即加载
class SingletonHungary {
private static SingletonHungary singletonHungary = new SingletonHungary();
//将构造器设置为private禁止通过new进行实例化
private SingletonHungary() {
}
public static SingletonHungary getInstance() {
return singletonHungary;
}
}
静态内部类
//使用静态内部类实现单例模式--线程安全
class SingletonStaticInner {
private SingletonStaticInner() {
}
private static class SingletonInner {
private static SingletonStaticInner singletonStaticInner = new SingletonStaticInner();
}
public static SingletonStaticInner getInstance() {
return SingletonInner.singletonStaticInner;
}
}
volatile 双重锁校验 - 多线程安全
new
关键字不是一个原子的操作,它分成下面三个步骤进行:
- 给
instance
分配内存 - 调用
Singleton
的构造函数来初始化成员变量 - 将
instance
对象指向分配的内存空间(执行完这步instance
就为非null
了)
如果虚拟机存在指令重排序优化,则步骤 2 和 3 的顺序是无法确定的。
public class Singleton {
private static volatile Singleton instance = null;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}