Preface
Last updated
Last updated
Java 是一门面向对象的语言,有两个显著的特征:
书写一次,到处运行(Write once,run anywhere)
垃圾收集(GC,Garbage Collection)
Java 分为编译期和运行期,这里的编译与 C/C++ 编译不同,Java 编译成字节码,而 C/C++ 编译成机器码。
运行期 Java 加载字节码,解释或编译(注意:这里的编译又与上面说的编译不一样)执行,如 JDK 8 是解释和编译混合执行。Server 模式的 JVM 会进行上万次调用收集足够信息来高效编译,而 client 模式是1500 次。HotSpot 内置了两个 JIT(Just-In-Time),C1 对应 client 模式,适合启动速度高的应用,如桌面应用;C2 对应 server 模式,适合长时间运行的应用,如服务端应用,采用分层编译(TieredComplilation)。
-Xint
:仅解释执行。
-Xcomp
:不要进行解释执行,会导致启动慢很多,而且不能根据运行情况有效优化,如分支预测。
AOT(Ahead-of-Time Compilation):直接将字节码编译成机器码,如 JDK 9 引入了 AOT,增加了 jaotc 工具。AOT 可以和分层编译结合,不是二选一。
从本质上来讲,Switch 对 String 的支持,其实是对 int 类型的匹配。调用 String 的 hashCode()
方法,得到一个 int 值,若匹配成功则接着调用 equals()
方法。所以 String 变量不能为 null
,case 子句中的 String 也不能为 null
。
可以在 catch
代码块中捕获多个异常 catch (NumberFormatException | NullPointerException e)
。
byte、short、int、long 可以用二进制表示。0b001, 0B111
。
数字中间可以增加分隔符,在编译的时候下划线会被去掉。int c = 123_456
。
Java7以前:Map<String, String> dict = new HashMap<String, String>()
Java7:Map<String, String> dict = new HashMap<>()
。
增加了 fork/join 框架。
Lambda 表达式是一个匿名函数。基本语法:
(parameters) -> expression 或 (parameters) -> {statements;}
。
通过函数式接口来实现的,Java8 新增了特殊的注解@FunctionalInterface
。
可以直接饮用 Java 类或对象的方法,可以看做是更加简洁的 Lambda 表达式。
构造方法:ClassName::new
。
静态方法:ClassName::method
。
新增了 LocalDate 和 LocalTime 接口,把月份和星期都改成了 enum,把上述两个类变成不可变类,所以线程安全了。
当 Hash 冲突时,Java8 以前用链表存储,Java8 开始,当冲突节点个数 >=TREEIFY_THRESHOLD - 1
时,将采用红黑树存储。
JDK1.5 引入了注解机制,但是相同的注解在同一位置只能声明一次。
重复注解:JDK1.8 可以使用相同的注解在同一地方声明多次。
应用范围扩展:可以给局部变量、泛型、方法异常等提供注解。
在编译的时候增加 -parameters 选项,反射 Parameter.getName()
可以获取参数名。
处理空指针异常,增强了代码的可读性。
函数式编程风格。
把 Base64 编码添加到了标准类库。