java 1.0
1996年1月23日。历史铭记这一天。喊着write one work any where(WOKA)的java诞生了。任何java代码在任何符合标准的JVM上都可以运行。
jdk 1.1
引入jdbc
引入内部类
引入java bean
引入RMI
引入了内省的反射机制
引入了JIT,JIT被成为java即时编译器,所以很可能和javac混淆,实际上,javac是负责把java代码编译为字节码,而jit是负责把字节码编译成本地方法。默认情况下,JVM已经打开了JIT功能,它会在你的代码中寻找热点方法,然后将他们编译为本地方法以提高效率。
jdk 1.2
引入集合框架
引入ThreadLocal
jdk 1.3
引入了sound API
jdk 1.4
引入断言
引入正则表达式
引入了异常链
引入了java nio 所谓的new IO,新手程序员这么命名肯定会被骂,大牛这么写则大家装作没看见。java.io中的类是面向流的,而这个新IO则是面向缓冲区的。
引入了unsafe类,虽然官方强烈不建议使用这个类,但是在诸如JUC等中还是广泛的使用了这个类。unsafe类相当于JVM的后门,可以进行分配堆外内存,或者直接对JVM中的某一个对象进行修改,中断或者恢复线程(JUC中locksupport的park和unpark的实现基础)
java 1.5
自动装箱和拆箱,从此就再也不用担心int和integer区别了,bug也变多了,不知道为啥。
枚举,用来设计单例模式。为啥?这是因为有些小伙伴实在不守规矩。你不是把构造函数标记成private嘛?欺负我不会反射!由此,改用内部静态enum的方法来实现,因为JVM会保证enum不能被反射并且构造器方法只执行一次。不过,这真是发明枚举的人想要的吗?
静态导入, 使用import static 包名.类名.静态成员函数、import static 包名.类名.静态成员变量可以让代码不需要类名就可以直接调用该函数或是该变量。私以为,这是被C++宏定义嘲笑后的结果。java程序员怎么能比c++程序员更多敲键盘呢?
可变参数, 也是一个c++要有java就要有的东西。传入函数的参数个数可以变化。
public static int add(int x,int ...args)
注解,非常有用。不过这时候注解的共同还不是很全面。比如说1.5时只有在覆盖父类的方法时才能使用@override,对实现接口中的方法则不可以。
JUC,不懂多线程,怎么能说自己学过java呢??JUC引入了一系列的类,比如说CountDownLatch。Lock接口及其一系列实现比如ReentrantLock。
foreach循环
JVM调试
从本版本后,JVM提供给APM(应用性能厂商)的运行时接口JVMPT逐渐被JVMTI所代替,用来设计native agent。另外,引入了纯java接口方案(java agent)
JVM可视化工具 JConsole被推出。
java引入了java.lang.instrument包,用于写上述的java agent。但是注意,这个版本中java agent必须在启动时指定。
java 1.6
JVM引入了逃逸分析。至此,一切对象都在堆上分配的说法成为历史。JVM会在JIT阶段将本地小对象分配在方法栈上,从而根本不必使用GC。
对synchronized关键字进行优化,原本该锁只是一个简单的重量级锁,新增了偏向锁,轻量级锁的实现机制。
支持了JSR269,该规范制定了一个API,所有实现该API的代码可以在javac执行过程中被调用,可以直接修改抽象语法树。lombok技术就是基于这个规范实现的。
JVM可视化工具 VisualVM被推出。
动态加载instrument Java SE 6 的新特性改变了这种情况,通过 Java Tool API 中的 attach 方式,我们可以很方便地 在运行过程中动态地设置加载代理类,以达到 instrumentation 的目的。
java 1.7
泛型实例化类型自动推断, 你可以使用它下面的第二种写法了。
List<String> tempList = new ArrayList<String>()
List<String> tempList = new ArrayList<>()
switch中可以使用字符串了
AutoCloseable接口和try-with-resource用法
多讲一句,Closeable是AutoCloseable的子接口。这挺难让人理解的,为啥可以自动关闭是可关闭的子接口?其实,我们也看到了,这里所谓的auto,是能try-with-resource的。1.7以前,没有AutoCloseable接口,大家都是开开心心的实现的Closeable接口。为了保证这些只实现Closeable的旧代码能使用try-with-resource,就是写一个AutoCloseable的接口来做Closeable的父接口。虽然说AutoCloseable这个名字确实不好,但是貌似也没有什么名字能表达这层含义。
java 1.8
lamda表达式
接口里的defalut:从此之后,你可以在接口中实现方法了。多说一句,以往接口中也可以写实现代码,但是必须写在内部类里。现在,java最后一点整洁也被无情的抛弃了。
接口里的static:接口中同样可以定义static了。但是static必须被实现。
Optional:用于防止空指针问题。受到了google的Guava项目的影响。
Optional< String > fullName = Optional.ofNullable( null );
System.out.println( "Full Name is set? " + fullName.isPresent() );
System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) );
System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) )
如果不这么搞,那么,你必须在使用任何引用时检查是否为null。而java灵活的特性,使得任何引用都可能为null。
java 1.9
模块系统:这确定不是从写JavaScript那帮人抄的?后台抄前端代码,颇为掉价。JDK 8之前的版本,一个包中的公共类型可以被其他包访问,没有任何限制。 换句话说,包没有控制它们包含的类型的可访问性。 JDK 9中的模块系统对类型的可访问性提供了细粒度的控制。提供了JLINK的小工具,你不用子运行时才有尴尬的ClassNotFound了。
接口中的private方法:java8不是实现了接口中的defalut方法吗,如果这个方法很长,就需要拆分,这时候就需要接口中的private方法了
JDK 1.10
局部类型推断 :推出了var关键字。这样,范性类型自动推断还没理解的同学,你们这下你需学习全部的类型自动推断了。
未来
Oracle支持了这下面四个项目作为JAVA 未来的发展方向。
Amber 项目(https://www.infoworld.com/article/3187868/application-development/oracles-java-on-java-experiment-picks-up-steam.html)是面向生产力的语言特征孵化器,包括局部变量类型推断在内的各种较小的语言,目标是减少编写 Java 代码的相关程序、通过增强枚举使类型变量的常量执行更为清晰、提高 Lambda 方法的可用性。
Panama 项目(https://www.infoworld.com/article/2607953/java/article.html),将 JVM 和本地代码互连,具有来自 JVM 的本地函数调用和来自 JVM 的本地数据访问等功能。
Valhalla 项目(https://www.infoworld.com/article/2608087/java/java-incubator-to-explore-technologies-for-java-10-and-beyond.html)是高级 Java 虚拟机和语言特性孵化器。
Loom 项目(http://cr.openjdk.java.net/~rpressler/loom/Loom-Proposal.html),以降低编写并发应用程序的复杂性为目标,项目要求添加可选的用户模式线程实现、定界延续以及涉及调用堆栈操作的其他构造。通过提供一个由 Java 编写的调度器,替代实现线程的管理,这样子普通 Java 线程的 Java 编程模型就可以被保留下来,提高了性能,减少了占用空间。
感觉JAVA的未来一片黑暗。