前言
这是一篇偏个人感悟的介绍文章,文中内容来自于网络,我搜集于此将他们整理,间或加入一些自己的想法。行文偶有错漏,若有余力,亦会后续修订。
适逢年初新冠肺炎爆发,前公司因美国疫情冲击被迫解散。几经周折在这艰难时间我讨到了一份工作。做了近5年的.net是要与之暂别了,似与友人所说:“.net core也许终将迎来辉煌,但那是10年之后,已不属于我们这一代人”。于是在近30岁的年龄上,我转向了Java。
一切从头开始,颇有一朝等级归0,再拿木剑走出新手村的感悟。万幸思想还在,经验还在,无惧再走一遭。
鉴于此。我认为,新学一门语言,最基础的并不是从“Hello World”开始,而是从其历史开始。先得了解他从哪来,才能知道他是谁,他为什么是这样。脱离历史去学习语言是不明智的,学习任何事物亦如此。
了解语言历史,可以整体把握语言起源和其进化脉络,从而解决下面这几个问题:
- 为什么选择这个版本。
- 为什么在这个时间点会出现并需要这个特性。
- 这门语言的重点在哪里,应该怎样去学习。
Java诞生
Java语言的诞生具有一定的戏剧性,它并不是经过精心的策划,制作,最后产生的划时代产品。从某种角度来看,java语言的诞生完全是一种误会。
1990年末,太阳(Sun)公司预料嵌入式系统将在未来家用电器领域大显身手。
于是太阳公司成立了一个由詹姆斯·高斯林(James Gosling)领导的格林(Green)计划 ,准备为下一代智能家电(电视机、微波炉、电话)编写一个通用控制系统。
该团队最初考虑使用C++语言,但很多成员包括太阳公司首席科学家比尔·乔伊(Bill Joy)发现C++和可用API在某些方面存在很大问题。工作小组使用嵌入式平台,可用系统资源极其有限,C++太过复杂,以致很多开发者经常错误使用。并且C++缺少垃圾回收系统,可移植性差,缺乏分布式和多线程等功能。
权衡可用资金后,乔伊决定开发一种新语言,他提议在C++基础上开发一种面向对象的环境。于是,高斯林试图通过修改和扩展C++已有功能来满足要求,但后来他放弃了。他决定创造一种全新的语言----Oak(橡树)。他们都具有不将就精神,在具有资金的支持下不断寻求创新。
到了1992年夏天,格林计划已经完成了新平台的部分功能,包括格林操作系统,Oak的程序设计语言、类库等。同年11月,格林计划被转化成第一人(FirstPerson)有限公司----一个太阳公司的全资子公司。
第一人团队致力于创建一种高度互动设备。当时代华纳公司发布了一个关于电视机顶盒的征求提议书时,第一人团队改变了他们的目标。作为对征求提议书的响应,提出了一个机顶盒平台提议。但是有线电视业界觉得第一人的平台给予用户过多控制权,因此第一人的投标败给了硅图(SGI)公司。同时,3DO公司另外一笔关于机顶盒的交易没有成功。此时,可怜的格林项目几乎接近夭折,甚至格林项目的一半成员也被调到了其他项目组。
时间来到1994年夏天,互联网和浏览器的出现不仅给广大互联网用户带来福音,也给Oak语言带来了新的生机。高斯林立即意识到,这是一个千载难逢的机会,于是对Oak进行了小规模改造。到了1994年秋,小组中的诺顿(Naughton)和乔纳森·佩恩(Jonathan Payne)完成了第一个Oak语言的网页浏览器----WebRunner。
太阳公司实验室主任伯特·萨瑟兰(Bert Sutherland)和技术总监埃里克·施密特(Eric Schmict)观看了浏览器的演示,对浏览器效果给予了高度评价。当时Oak这个商品已经被注册,于是只得将Oak更名为Java。
太阳公司在1995年初发布了Java语言,太阳公司直接把Java放到互联网上免费给大家使用,甚至连源代码也不保密,向所有人公开。几个月后,让所有人都吃惊的事情发生了。Java成了互联网上最热门的宝贝,竟有10万多人次访问了太阳公司的网页,下载Java语言。然后,互联网上立即就有了数不清的Java小程序(Applet),演示着各种小动画、小游戏等。
Java语言终于眼眉吐气了,成为了一种广为人知的编程语言。
Java发展
在Java语言出现之前,互联网网页实质上就像一张纸,不会有任何动态内容。有了Java语言后,浏览器的功能被扩大了,Java程序可以直接在浏览器里运行,可以直接与远程服务器交互。用Java语言编程,可以在互联网上像传送电子邮件一样方便地传送程序文件!
太阳公司虽然推出了Java,但这只是一种语言,如果想开发复杂应用程序,必须要有一个强大的开发类库。因此,太阳公司在1996年年初发布了JDK 1.0(Java Development Kit)。这个版本包括两部分,运行环境JRE(Java Runtime Environment)和开发环境JDK。运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机(Java Virtual Machine)5个部分。开发环境包括编译Java程序的编译器(即Javac命令)。
接着,太阳公司在1997年2月18日发布了JDK 1.1。JDK 1.1增加了即时编译JIT(Just In Time)编译器。JIT和传统编译器不同,传统编译器是编译一条,运行完成后将其扔掉。而JIT会将经常用到的指令保存在内存中,当下次调用时就不需要重新编译了,通过这种方式提升了JDK的效率。
但一直以来,Java主要应用就是网页上的Applet以及一些移动设备。到了1996年年底,Flash面世了,这是一种更简单的动画设计软件,使用Flash几乎无须任何编程语言知识,就可以做出丰富多彩的动画。随后Flash增加了ActionScript编程脚本,Flash逐渐蚕食了Java在网页上的地盘。
从1995年Java诞生到1998年底,Java语言虽然成为了互联网上广泛使用的编程语言,但它并没有找到一个准确定位,也没有找到它必须存在的理由。Java语言可以编写Applet,而Flash一样可以做到,并且更快,开发成本更低。
直到1998年12月,太阳公司发布了Java历史上最重要的JDK版本,JDK 1.2,伴随着JDK 1.2一同发布的还有JSP(JavaServer Pages)/Servlet、EJB(Enterprise Java Beans)等规范,并将Java分成J2SE(Java 2 Standard Edition)、J2EE(Java 2 Enterprise Edition)和J2ME(Java 2 Micro Edition)三个版本。
- J2SE:整个Java技术的核心和基础,它是J2ME、J2EE编程的基础。
- J2EE:Java技术中应用最广泛的部分,J2EE提供了企业应用开发相关的完整解决方案。
- J2ME:主要用于控制移动设备和信息家电等有限存储的设备。
此外,JDK 1.2还将API分成了三类:
- 核心API:由太阳公司制定的基本API,所有Java平台都应提供,即Java核心类库。
- 可选API:这是太阳公司为JDK提供的扩充API,这些API因平台而异。
- 特殊API:用于满足特殊要求的API,如JCA(Java Connector Architecture)和JCE(Java Cryptography Extension)等第三方加密类库。
至此,太阳公司开始使用Java 2这一名称,我们已经极少使用JDK 1.1版本,因此我们所说的Java一般从Java 2开始。J2EE提供了企业应用开发相关的完整解决方案。这标志着Java已经吹响了向企业、桌面和移动三个领域进军的号角,这个时期也是Java高速发展的时期。在Java 2中,Java发生了很多革命性的变化,而这些革命性变化一直沿用至今,对于Java的发展形成了深远影响,直到今天还经常看到J2EE、J2ME等名称。
2002年,太阳公司发布了JDK历史上最成熟的版本----JDK 1.4成为发展最快的一个JDK版本。JDK 1.4已经可以使用Java实现大多数应用了。在此期间,Java语言在企业应用领域大放异彩,涌现出大量基于java语言的开源框架,Struts、WebWork、Hibernate、Spring等。大量企业应用服务也开始涌现,WebLogic、WebSphere、JBoss等,这些都标志着Java语言进入了飞速发展时期。
2004年10月,太阳公司发布了万众期待的JDK 1.5。同时,太阳公司将JDK 1.5改名为Java SE 5,J2EE、J2ME也相应地改名为Java EE和Java ME。JDK1.5增加了诸如泛型、增强的for语句、可变数量形参、注释、自动拆箱和装箱等功能。同时,也发布了新的企业级平台规范,如通过注释等新特性来简化EJB的复杂性,并推出了自己的MVC框架规范----JSF(JavaServer Faces),JSF规范类似于asp.net的服务器端控件,通过它可以快速构建复杂的JSP界面。
2006年12月,太阳公司发布了Java EE 6。一直以来,太阳公司维持着大约2年发布一次JDK新版本的习惯。但在2009年4月20日,甲骨文(Oracle)公司宣布将收购太阳公司。太阳公司倒下了,不过Java的大旗依然猎猎作响。
2011年7月28日,甲骨文公司终于如约发布了Java SE 7,这次版本升级经过了将近5年时间。Java SE 7也是甲骨文公司发布的第一个Java版本,引入了二进制整数,支持字符串的switch语句,棱形语法,多异常捕抓,自动关闭资源的try语言等新特性。
2014年3月18日,甲骨文公司发布了Java SE 8,这次版本升级为Java带来了全新的Lambda表达式,流式编程等大量新特性,这些新特性使得Java变得更加强大。
2017年9月22日,甲骨文公司发布了Java SE 9,这次版本升级强化了Java的模块化系统,让庞大的Java语言更轻量化,而且采用了更高效,更智能的垃圾回收器,并在核心类库上进行了大量更新,可以进一步简化编程。但对语法本身更新并不多(毕竟Java语言已经足够成熟)
2018年3月21日甲骨文公司发布了Java第十个大版本。为了更快地迭代,更好地跟进Java社区反馈,Java语言版本发布周期调整为每隔6个月发布一次。Java 10是这一新规则之后,采用新发布周期的第一个大版本。Java 10带来了很多新特性,其中最备受关注的莫过于局部变量类型推断。除此之外,还有其他包括垃圾收集器改善、GC改进、性能提升、线程管控等一批新特性。
2018年9月25日,甲骨文公司宣布Java 11 (18.9 LTS) 正式发布,值得注意的是,Java 11是Java的一个长期支持版本LTS(Long Term Support),而上一个长期支持版本是2014年发布的Java 8。Java 11的技术支持时间直到2023年9月份,补丁和扩展支持直到2026年9月份。同时甲骨文公司公布的Java后续版本路线图展示新的长期支持版本将每三年发布一次,根据后续的发布计划,下一个长期支持版Java 17将于2021年发布。
2019年3月19日,Java 12正式发布。
2019年9月17日,Java 13发布。
2020年3月17日,在全球抗疫背景下,Java 14正式发布。
Java历史年表
截至2020年5月6日,Java累计经历了13次主要版本更新,来到了Java 14。
版本 | 发布日期 | 主要事件 |
---|---|---|
Java | 1995年5月23日 | Java语言发布,用Java实现的浏览器和Java Applet被大量应用。 |
JDK 1.0 | 1996年1月23日 | 奠定了JDK、JRE、JVM的体系结构。 |
JDK 1.1 | 1997年2月18日 | 加入JIT,提升JDK效率。 |
JDK 1.2(Java 2) | 1998年12月4日 | 确立J2SE、J2EE、J2ME产品结构,开始飞速发展。 |
JDK 1.3 | 2000年5月18日 | 内置HotSpot JVM。 |
JDK 1.4 | 2002年2月13日 | XML处理,断言,支持正则表达式。 |
Java SE 5(JDK 1.5) | 2004年9月30日 | 静态导入,泛型,for-each循环,自动拆、装箱,枚举,可变参数。 |
Java SE 6(JDK 1.6) | 2006年12月11日 | 提供动态语言支持,同步垃圾回收。 |
Java SE 7(JDK 1.7) | 2011年7月28日 | 字符串的switch语句,多异常捕抓。 |
Java SE 8(JDK 1.8) | 2014年3月18日 | Lambda表达式。 |
Java 9 | 2017年9月22日 | 轻量级json API,垃圾收集机制更新。 |
Java 10 | 2018年3月21日 | 局部变量类型推断,Java后续版本快速迭代更新。 |
Java 11 | 2018年9月25日 | 常用类增强,Java 11是继Java 8之后的首个长期支持本版。 |
Java 12 | 2019年3月19日 | switch表达式增强。 |
Java 13 | 2019年9月17日 | 文本块支持。 |
Java 14 | 2020年3月17日 | instanceof支持模式匹配。 |
目前,Java 7,8的使用比例较多,其次为11,12。企业青睐长期支持版本。
结语
没想到一口气写完了这篇文章,严格来说我只是一个搬运工加排版编辑者。通过这样一次梳理,我也记住了一些Java领域的专有名词。千里之行始于足下。言于此,祝诸君(也包括自己)前程似锦,一片坦途。
引用
本文遵循以下引用声明及协议,若存在任何侵权行为,请联系本文作者删除。
版权声明:本文部分内容为CSDN博主「Jessica-小波」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wxb1410...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。