在jdk1.7后,switch支持String和枚举,在这之前switch只支持int、char、short、byte以及其包装类Integer、Character、Short、Byte;char则转换为ascII码值就行匹配,实际还是转换为java基本类型。
switch在处理String和枚举类时,实际上调用了hashcode()和equal()方法进行匹配,hashcode()方法将类型转换为int,而由于哈希存在碰撞的可能性,还需要进行一次equal()进行安全校验。
多种编程语言都支持泛型,泛型的实现有两种:Code specialization 和 Code sharing
Code sharing的含义是共享字节码/目标代码,通过类型擦除,擦除后使用的是同一份字节码/目标代码。
Java在类型擦除时按照两个规则:
自动装箱是Java将int、byte、short、long、char、double、float、boolean基础类型,自动转换为Integer、Byte、Short、Long、Character、Double、Float、Boolean包装类。
自动拆箱则反之。
自动装箱例子:
1 | public static void main(String[] args) { |
反编译后:
1 | public static void main(String[] args) { |
自动拆箱例子:
1 | public static void main(String[] args) { |
反编译后:
1 | public static void main(String[] args) { |
可以通过反编译后的代码看出,实际上自动装箱是使用valueOf()方法实现,自动拆箱使用xxxValue()方法实现。
可变长参数的实现:用数组实现,将多个参数封装成数组
枚举类是Java语法糖之一,java枚举类隐式继承java.lang.Enum,所以枚举类不能继承其他类(Java单继承),但可以实现接口。
枚举类会继承values()、valuesOf()方法,枚举类中的枚举实例实际上是其本身的类实例并声明了public static final,所以对于枚举实例,可以声明变量外,还可以重写方法。
在Color中,GREEN实例重写了sayName方法,调用重写了方法的实例和无重写,会有不同的效果。
1 | //枚举类 |
1 | //测试类 |
1 | //输出 |