Java 是目前最流行的语言之一,Java 的应用相当广泛,Java是最流行的基于虚拟机的编程语言……
这么火的Java,经历的怎么样的发展历程才走到今天的呢?
Java 0
Java的原型是1991年的Oak。Oak语言一开始是设计用来给电视编程的,不过Oak太先进了导致电视跑不动Oak代码。后来Oak项目更名Java,也被设计成了一个C语言风格的语言方便程序员切换平台(毕竟长得像用得顺手)。Java语言就这么“碰巧”设计出来了。
JDK 1.0
1995年太阳微系统公司(Sun Microsystems)发布了Java 1.0。宣传口号是:“一次编码到处运行”。
JDK 1.1
1997年JDK 1.1发布。新增了反射API。随之而来的是JavaBeans。AWT(抽象窗口工具包)也迎来了更新,事件系统获得了大规模重写。
J2SE 1.2
1998年J2SE 1.2发布。Java 1.2新增了集合框架(java.util.*),以淘汰Java 1.0的一些旧的集合类。新的JVM(JDK 1.0的JVM现在被称作Classic VM,新的JVM称为Exact VM,支持了JIT编译器加快运行速度)。同时新增了Swing API,使得Java编写桌面客户端的能力大幅提升(现在也有很多使用Swing的程序)。
J2SE 1.3
2000年Java 1.3发布。虚拟机重大更新,Sun收购公司得到的更优秀的Hotspot虚拟机被设为Java的默认虚拟机。JVM的效率获得大幅提升。
J2SE 1.4
2002年Java 1.4发布(貌似现在很多项目还是基于Java 1.4和1.5)。
支持了正则表达式、NIO(新的IO库更加注重性能,同时API也更好用,后来Java库代码重写将很多基于旧IO的代码更新成NIO加快Java IO的速度)、日志API(轻量级,但不支持获取线程名,不如log4j好用),集成了XML解析器。
// regex
Pattern pattern = Pattern.compile("...");
Matcher matcher = pattern.matcher(a string);
if (matcher.match()) {
...
}
J2SE 1.5
2004年Java 1.5发布。这个版本是对语言特性的重大更新。支持了泛型(Generics),auto boxing and unboxing(也就是基本类型和对应的类间的隐式转型),枚举类型(Java的枚举类型十分强大),for each语法(而不再需要Iterable等依赖传统的for循环遍历集合,代码变得更简洁也更不易出错),可变长参数(千呼万唤始出来),并发库(包含了好几个支持并发的集合,代码十分优美精炼,毕竟是牛人写的代码)等。
enum Images implements Resource<Image> { // Generics
LOGO("/assets/logo.png"),
...;
static int id = 0;
static Map<String, Integer> map = new HashMap();
private Images(String location) {
map.put(location, ++ id); // auto-boxing
...
}
public static void doSomething() {
for (String location : map.keys()) { // for each
...
}
}
}
Java SE 6
2006年Java 1.6发布。Java 6注重于提升性能并支持一些新的库。
Java SE 7
2011年Java 1.7发布。原定的Java 7是一个大更新,支持lambda表达式,coin项目,jigsaw模块化等大更新。而这几个功能在当初是十分适应时代发展的。但Sun被收购的一段时间内Java的开发进程被拖慢,许多功能被推迟到Java 8(其中部分功能包括jigsaw和coin被推迟到Java 9)。
时隔5年才发布的Java 7支持了invokedynamic指令方便动态语言使用(后来被Java 8用来支持lambda表达式),switch支持字符串的枚举,Diamond操作符(泛型参数由编译器自动推导),multi-catch(一次性捕获多种异常进行同一种异常处理)。
try {
ArrayList<Integer> list = new ArrayList<>(); // Diamond operator
// Invoke some method with exceptions
} catch (IOException | SAXException e) { // multi-catch
// TODO
}
Java SE 8
2014年Java 1.8发布。一次革命性的更新:支持了lambda表达式。这将极大地改变Java代码的方式。新的日期和时间API,自带JavaFX。JVM中用metaspace代替了permanent generation。
比如我们可以这么写了:
List<Integer> transactionsIds = transactions
.parallelStream()
.filter(t -> t.getType() == Transaction.GROCERY)
.sorted(comparing(Transaction::getValue).reversed())
.map(Transaction::getId)
.collect(toList());
Java SE 9
2017年Java 1.9发布。又是一次真·革命性更新(把一大堆项目给搞坏了【真革命系列】,向下兼容性极差【这些项目都使用了非公共API的Sun内部API,也就是有风险未来可能被移除,但这是不得不使用的】)。还有一些其他的东西。G1GC成为了默认的垃圾回收器。
比如一个module-info.java
module com.company.someapp {
exports com.company.api;
requires java.base;
}
小结
Java 经过了20多年的发展,正处于不断地更新与完善的过程中,看着一个语言的发展就如同看一个小孩的成长一样,希望语言越变越好。这可能也是Java能成为最流行语言之一的原因吧。