1、jdk的发展史及特性
1995年5月23 java(原名Oak)诞生,并且在SunWorld大会上正式发表了java1.0版本。
1996年1月23 JDK1.0发布Java语言有了第一个正式版本的运行环境。JDK1.0提供了一个纯解释执行的Java虚拟机的实现(Sun class VM)。JDK1.0的代表技术:JVM,Applet,AWT.
1997年2月19日,JDK1.1,新特性:JAR文件格式、JDBC、JavaBean、RMI、内部类(Inner class)、反射(Reflection)
1998年12月4日,JDK1.2,新特性:基础体系拆分:J2SE(面向桌面应用程序开发)、J2EE(面向企业级应用开发程序开发)、J2ME(面向手机等移动终端开发),技术:EJB、Java Plug-in、JavaIDL 、Swing、JIT(Just In Time)编译器.
2000年5月8日JDK1.3:使用CORBA IIOP实现RMI的通信协议,改进Java2D,添加JavaSound类库。
2002年2月13日JDK1.4 ,新特性:正则表达式,异常链,NIO,日志类,XML解析器,XLST转换器。
2004年9月30日,JDK1.5,新特性:自动装箱、泛型、动态注解、枚举、可变长参数、遍历循环。
2006年12月11日,JDK1.6,新特性:提供动态语言支持、提供编译API和卫星HTTP服务器API,改进JVM的锁,同步垃圾回收,类加载。
2009年2月19日JDK1.7,新特性:提供GI收集器、加强对非Java语言的调用支持(JSR-292,升级类加载架构。
2014 年 3 月 18 日 JDK1.8新特性:Lambda 表达式、方法引用、默认方法、新工具、Stream API、Date Time API 、Optional 类、Nashorn, JavaScript 引擎。
2017年9月21日jdk9.0,新特性:模块系统、HTTP 2 客户端、多版本兼容 JAR 包、私有接口方法、改进的 Stream API、响应式流(Reactive Streams) API:
2018年3月21日jdk10,新特性:var 局部变量类型推断、统一的垃圾回收接口
2018年9月25日jdk11,新特性:HTTP客户端(标准)、无操作垃圾收集器。首个LTS版本
2019年3月19日jdk12:新增一个名为 Shenandoah 的垃圾回收器、扩展switch语句的功能、改进 G1 垃圾回收器
2、特性描述
Java5
-
泛型
List<Integer> list=new ArrayList<Integer>();
- 增强循环
int[] array = {1, 2, 3, 4, 5};
for (int i : array) {
System.out.println(i);
}
- 自动封箱拆箱(Autoboxing/Unboxing ):八大基本类型和它们的包装类能够自动的相互转换
Integer in1 = new Integer(n); int m = in.intValue();
- 枚举:实现线程安全的单例模式好方式
enum TestEnum{
one,
two;
TestEnum() {
}
}
- 可变参数
语法:(type...argument)
可变参数本质仍然是用一个数组存储参数,只是java隐藏了这一过程。需要注意的是如果一个方法声明中含有可变参 数,那必须放在最后一个位置
案例:
public static void testVarargs(String...args){
//本质就是个数组
System.out.println(args[1]);
for (String arg : args) {
System.out.println(arg);
}
}
- 静态导入(Static Import)
通过import类来使用类里的静态变量或方法(直接通过名字,不需要加上类名.),简化了代码的书写。
//单个导入
import static java.lang.Math.PI;
//批量导入
import static java.lang.Math.*;
- 注解(Annotations)。关键字@interface。
//注释注解的注解又叫做元注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotations {
//注解内可以添加方法,也可以不添加
//注解方法的返回值只能是基本类型,String,Class类,枚举,注解,可以有默认值。
int id();
String name() default "whh";
Class classType();
TestEnum enumType();
}
- 新的线程模型和并发库(java.util.concurrent)。
Java6
-
集合框架增强。
为了更好的支持双向访问集合。添加了许多新的类和接口。
新的数组拷贝方法。
Arrays.copyOf和Arrays.copyOfRange
//以下为添加的新接口和类
Deque,
BlockingDeque,
NavigableSet,
NavigableMap,
ConcurrentNavigableMap,
ArrayDeque,
ConcurrentSkipListSet ,
ConcurrentSkipListMap,
ConcurrentSkipListMap,
AbstractMap.SimpleEntry ,
AbstractMap.SimpleImmutableEntry
- Scripting. 可以让其他语言在java平台上运行。 java6包含了一个基于Mozilla Rhino实现的javascript脚本引擎。
- 支持JDBC4.0规范
Java7
-
二进制前缀0b或者0B。整型(byte, short, int, long)可以直接用二进制表示。
//一个8位'byte'值:
byte aByte = (byte)0b00100001;
//一个16位'short'值:
short aShort = (short)0b1010000101000101;
//一些32位'int'值:
int anInt1 = 0b10100001010001011010000101000101;
int anInt2 = 0b101;
int anInt3 = 0B101; // B可以是大写也可以是小写.
//一个64位的'long'值. 注意"L"结尾:
long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;
- 字面常量数字的下划线。用下划线连接整数提升其可读性,自身无含义,不可用在数字的起始和末尾。
这个功能可以用来对一个数字字面量根据位数分组,从而提高你代码的可读性。比如,如果你的代码包含一些数字有很多的位数,你能够用下划线字符把位数分为三组,类似于你用一个像逗号或者一个空格作为分隔符。
下划线只能出现在数字之间,下面的情形不能出现下划线:
数字的开头和结尾
在浮点数中与小数点相邻
F或者L后缀之前
在预期数字串的位置
long creditCardNumber = 1234_5678_9012_3456L;
long socialSecurityNumber = 999_99_9999L;
float pi = 3.14_15F;
long hexBytes = 0xFF_EC_DE_5E;
long hexWords = 0xCAFE_BABE;
long maxLong = 0x7fff_ffff_ffff_ffffL;
byte nybbles = 0b0010_0101;
long bytes = 0b11010010_01101001_10010100_10010010;
float pi1 = 3_.1415F; // 无效; 不能和小数点相邻
float pi2 = 3._1415F; // 无效; 不能和小数点相邻
long socialSecurityNumber1 = 9