《Java:the legend》读书笔记

      最近要准备面试和找工作,所以找了些书来复习下,看到这本Ben Evans的《Java:the legend》,对于长期活在JDK1.4和1.6的我,很要必要补补知识。
全书最显眼的是这句:
Java is a blue collar language. It’s not PhD thesis material but a language for a job.
                                  —James Gosling
 

Chapter 1. History and Retrospective

Sun在1995年发布了Java的第一个版本,里程碑版本是2004发布的Java 5。
 
1.1)Java与开源
1998,Sun创建了Java Community Process (JCP),让其他公司和团体参与到Java的标准制定中。
在2006年 ,Sun公司宣布Java开源,这直接导致了OpenJDK的项目的诞生。
 
2005,Apache Foundation 开始着手一个开源和干净版本的Java实现,这个最高级别的项目后来叫做Harmony。为了开展项目,阿帕奇向Sun公司索取Testing Compatibility Kit (TCK),但是Sun公司没有同意。Harmony后来是谷歌应用程序设计框架的基础。
 
在2006年Java 6发布后,Sun志向于在2009年发布Java 7,计划包括Lambda表达式、新的模块化功能、新的GC、支持非Java语言运行在JVM上。但是,Sun公司卷入到了收购事项中,直到2010年,Sun公司被Oracle收购了,从此Java进入Oracle时代。
 
1.2)Oracle时代
 
2010, Oracle和Google就安卓上的Java技术的使用许可事项进行谈判。
 
Oracle继续不同意授权给Apache一个TCK许可,所以,Harmony项目在2011年宣布解散,Android是目前该技术的唯一继承者。
 
Oracle和Google的官司持续到2012年,法官果断地支持谷歌,这导致了Oracle对Java的掌控力开始衰退,Java平台也开始进入相对平静的时期(可以看出从2006~2011年基本没进步==!)。
 
2011年,Java 7发布;lambda表达式在2014年的Java 8中支持;被拖延了很久的模块化支持将在Java 9中支持。
 

Chapter 2. The Java Language

2.1)Java语言最初的设计目标:
后向兼容:此目标影响了后来Java 8的一些特性(接口函数的默认实现)
易学易读:IDEs起到很大的作用
简单的类型系统:万物皆是对象,单继承,枚举类型,注解
 
2.2)Java语言和VM相互影响:bytecodes,以及非Java语言在JVM上运行(JRuby,JavaScript等等)
 
2.3)关于库:不用多说,谁用谁知道,引用Java之父的话:
Java itself, as a language, is pretty simple, as are most languages.
The real action is in the libraries, and we tried hard to have a fairly
large class library straight out of the box.
—James Gosling
 
2.4)数组与集合:Java 1.2版本开始出现了比较全面的集合类;在Java 5,引入了泛型,提升了程序的安全性。
 
2.5)最近的发展:
2.5.1)Java 7,减少冗余语法
以前,用泛型是这样的写法:
Map<String, String> enToFrDict = new HashMap<String, String>();
到了Java 7,可以这样写:
Map<String, String> enToFrDict = new HashMap<>();
 
在Java 6及以前的版本,假如有多个异常需要捕获,是这样写:
 1 try {
 2 // Try to read a class file from disc, classload it to
 3 // get a class object and then access a method reflexively.
 4 //
 5 // This process can fail in a number of different ways...
 6 } catch (IOException iox) {
 7 // ...
 8 Recent Developments | 17
 9 } catch (InstantiationException instx) {
10 // ...
11 } catch (IllegalAccessException ilax) {
12 // ...
13 } catch (NoSuchMethodException nsmx) {
14 // ...
15 } catch (SecurityException secx) {
16 // ...
17 } catch (IllegalArgumentException ilargx) {
18 // ...
19 } catch (InvocationTargetException invtx) {
20 // ...
21 }
在Java 7,可以这样写:
try {
// Same loading process
} catch (IOException | InstantiationException
| IllegalAccessException | NoSuchMethodException
| SecurityException | IllegalArgumentException
| InvocationTargetException ex) {
// But now we can handle all failures with a
// single recovery block
}
 
2.5.2)Java 8的新特性
lambda expressions,函数式编程
Stream的引入,减少使用集合类时需要写的for循环
 
2.5.3)Java最好的地方:
  支持多线程:无需多言
  语言稳定:只有Java 5中的泛型和Java 8的lambdas表达式的引入会让使用者的感觉有变化。
  类型系统:声明式的静态的
 
2.5.4)Java的失败史:
  Java Beans:基本上每个使用者都抱怨,getter和setter...
  Finalization:由于GC是由机器确定的,所以就算代码中用了Finalization,也不一定及时释放资源。在Java 7中,try-with-resources是一个很好的补充。
  Java EE中的过度配置:那个相当于石器时代,写代码变成了写XML,这也是很多人排斥Java的原因。Java 7之后已经改善了很多,不过又有多少离开的人会重返Java怀抱呢。
  多线程:和现在新的语言Golang比,的确承认用Java来编写多线程代码麻烦很多。 
 

Chapter 3. The Java Virtual Machine and Platform

这章没讲特别的内容,举了两个类和相应bytecode如何运行的例子
 
3.1)自我管理(Self-Management):
关键的两句,摘录:
the use of runtime information to enable
the JVM to self-manage, sometimes called profile guided optimization
(PGO).
 
The JVM collects runtime information to make better decisions
about how to execute code.
 
3.1.1)JIT编译(Just-In-Time Compilation):举了一个尾递归的例子,javac命令不会对代码做优化,但是Scala会。
3.1.2)GC:无需多言,用户的代码不需要关注memory
 
3.2)Java语言之外
很多语言在JVM上运行(Ruby, Python, Lisp, and,Javascript)
Java7 引入了新的字节码命令invokedynamic
 

Chapter 4. Java Developers and the Ecosystem

 
4.1)The Java Community Process(JCP):Java Specification Requests (JSRs)
 
4.2)在Sun和Oracle之外的Java团体以及支持者:
  Eclipse:无需多言
  Apache:诸多famous的库
  Spring:取到官方J2EE标准的轻量级framework,其实现在也不轻了
 

Chapter 5. The Future of Java

5.1)Java 9:
  模块化:目前的jar不够有效
  变更默认的GC:换成Garbage First (G1) collector
  HTTP/2:The basic semantics (including methods) of HTTP have not fundamentally changed in the new standard,but the transport mechanisms are new.
  JShell:个人感觉没啥用,是看其他语言都有REPL,所以想加进来的。
 
5.2)更远的目标:
  Project Panama:目标是直接将Java方法和本地方法绑定起来,通过JNI也可以做到,但是这个接口不方便。
  Project Valhalla:很笼统,就说是关注于Java的新特性
  The Internet of Things:物联网,但是jdk和jre那么占空间,真的是未来物联网的佼佼者吗?
 
 
posted @ 2016-10-12 18:15  MasterSam  阅读(435)  评论(0)    收藏  举报