Java 基础

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;
    }
    
}

参考