Java历史、现状和各版本技术更迭总结

写在前面:
此文总结于 2016年12月21日10:24:39,主要用于了解 Java 语言的发展,以及 Java 语言的现状。个人观点:未来数十年 Java 依然会占有大部分市场,主要应用方向还是 Web 开发。文中很多内容都没有进过严谨的论证,等笔者以后有能力后,再进行修改补充。

0 Java 的故事

0.0 Java 的产生

Java语言最开始只是Sun电脑(Sun MicroSystems)公司在1990年12月开始研究的一个内部项目。Sun电脑公司的一个叫做帕特里克·诺顿的工程师被公司自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth计划”的项目的机会。

“Stealth计划”后来改名为“Green计划”,詹姆斯·高斯林和麦克·舍林丹也加入了帕特里克的工作小组。他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室里面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,Sun公司预料未来科技将在家用电器领域大显身手。团队最初考虑使用C++语言,但是很多成员包括Sun的首席科学家比尔·乔伊,发现C++和可用的API在某些方面存在很大问题。

工作小组使用的是嵌入式系统,可以用的资源极其有限。很多成员发现C++太复杂以至很多开发者经常错误使用。他们发现C++缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多执行等功能。最后,他们想要开发一种易于移植到各种设备平台上的语言。

根据可用的资金,乔伊决定开发一种集C语言和Mesa语言大成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议Sun公司的工程师应该在C++的基础上,开发一种物件导向的环境。最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为C++ ++ –,但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的橡树命名。

当Patrick Naughton加入该小组后,整个工作进展神速。Naughton也是Sun公司的技术骨干,曾经是Open Windows的项目的负责人。经过17个月 的奋战,整个系统胜利完成。包括Green操作系统,Oak的程序设计语言,类库及其硬件。最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形界面和被称为“Duke”的智能代理来帮助用户。而通常情况 下,这样的项目在Sun公司要75个人干三年。项目完成后,在Sun公司内部做一次展示和鉴定,观众的反应是: 在各方面都采用了崭新的、非常大胆的技术。许多参观者对Java留下了非常深刻的印象,特别得到Sun的二位领导人Scott McNealy和Bill Joy的关注,但Java的前途未卜。

0.1初战告败

接着,Java项目的工作人员开始做应用规划,着手成立一家公司,从事消费类电子产品的开发,这家公司就是FirstPerson Inc.。公司的第一个项目就是Time-Warner的投标项目,顶置盒式操作系统和请求式电视技术。虽然FirstPerson Inc.在技术毫不逊色于任何公司,但是由于经营策略上的失误,败给了SGI。FirstPerson一直到1994年初仍在坚持开发专用的顶置盒式操作系统,但实践证明,这个市场尚未成熟。例如:好几家交互式有线电视网的实验都以失败告终。 Naughton立即认识到研究方向应该转移。在Naughton的努力下,研究开始向在线服务,CD-ROM和基于网络的台式机方向转移。最后FirstPerson解散,一部分人去了Sun Interactive开发数字视频数据服务器,而另一部分开始把Java用于基于网络的台式机系统。

0.2 Java 语言的转折点

到了1994年,WWW已如火如荼的发展起来。Gosling意识到WWW需要一个中性的浏览器,它不依赖于任何硬件平台和软件平台。它应是一种实时性较高、可靠安全、有交互功能的浏览器。于是Gosling决定用Java开发一个新的Web浏览器。

这项工作由Naughton和Jonathan Payne负责,到1994年秋天,完成了WebRunner的开发工作。WebRunner是HotJava的前身,这个原型系统展示了Java 可能带来的广阔市场前景,给SunLab两位领导: Bert SutherLand和Eric Schmidt留下深刻印象,这一点非常重要,因为这两个人是Sun 的首席技术官员。特别是Sun的总裁McNealy对Java抱有坚定的信念,为Java进入WWW立下了汗马功劳。正如McNealy所料,WebRunner改名为 HotJava,并于1995年5月23日发表后,引起了产业界巨大的轰动,Java的地位也随之而得到肯定。McNealy卓越的洞察力和果断的决策,挽救了项差点锁进文件柜的技术。 又经过一年的试用和改进,Java 1.0版终于在1996年年初正式发表

0.3 Java的编年史

  • 1995年5月23日,Java语言诞生
  • 1996年1月,第一个JDK--JDK1.0诞生
  • 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
  • 1996年9月,约8.3万个网页应用了JAVA技术来制作
  • 1997年2月18日,JDK1.1发布
  • 1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
  • 1997年9月,JavaDeveloperConnection社区成员超过十万
  • 1998年2月,JDK1.1被下载超过2,000,000次
  • 1998年12月8日,JAVA2企业平台J2EE发布
  • 1999年6月,SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)
  • 2000年5月8日,JDK1.3发布
  • 2000年5月29日,JDK1.4发布
  • 2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机
  • 2001年9月24日,J2EE1.3发布
  • 2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升
  • 2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0
  • 2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME
  • 2006年12月,SUN公司发布JRE6.0
  • 2009年12月,SUN公司发布Java EE 6
  • 2010年11月,由于Oracle公司对于Java社群的不友善,因此Apache扬言将退出JCP[14]
  • 2011年7月28日,Oracle公司发布Java SE 7
  • 2014年3月18日,Oracle公司发表Java SE 8

1999年6月,Sun公司重新组织Java平台的继承方法,并将Java企业级应用平台作为发展方向,因此,到今天Java的大家族中已有了下面三个主要成员:JavaSE、JavaEE、JavaME

0.4 James Gosling 与 Java

40年前,一个寒冷的冬天,在加拿大一个村庄里,Gosling家的第一个男孩哇哇落地了。家人给他起了名字,叫James。谁也没有想到的是,长大之后,他成为了一个改变计算机语言的天才。

James Gosling从小就喜欢技术,爱鼓捣东西。12岁的时候,他用报废的电话机和电视机中的部件做了一台电子游戏机。附近农民的康拜因(联合收割机)出了问题也常常找他修理。14岁的时候,中学组织到附近大学参观,他记住了大学计算中心的门锁密码,从此开始偷偷地溜进计算中心,学习计算机编程。一年后,大学的天文系招他当了一名临时编程员,编写计算机程序来分析卫星天文数据。

80年代初,James Gosling获得博士学位后到IBM工作,设计IBM第一代工作站。当时,IBM的领导层并不看重工作站项目。失望之余,James Gosling跳槽到了Sun公司。他花了五年功夫领导开发的和OS2很类似的Sun NeWs窗口系统,尽管得到技术界的好评,却未能变成流行的产品。当时他还第一个用C实现的EMACS的所见即所得文本编辑器COSMACS。

在当今这个竞争激烈的软件开发时代,软件设计师一直在试图预测未来软件或者技术的发展趋势。在1990年,Sun公司成立了一个软件设计团队,其中除了James Gosling,还有Patrick Naughton和Mike Sheridan等人,他们合作的项目称为“绿色计划”。他们认为计算机技术发展的一个趋势是数字家电之间的通讯。James开始负责为设备和用户之间的交流创建一种能够实现网络交互的语言。随着大量的时间和金钱投入到“绿色计划”,他们创建了一种语言。这种语言一开始被叫做“Oak”,这个名字得自于Gosling想名字时看到了窗外的一棵橡树。但后来被改为了“Java”。并于1992年9月3日开始应用于Sun工作站的远程遥控。

Gosling在开始写Java时,并不局限于扩充语言机制本身,更注重于语言所运行软硬件环境,他要建立一个系统,这个系统运行于一个巨大的、分布的、异质的网络环境中,完成各电子设备之间的通讯与协同工作。Gosling在设计中采用了虚机器码(Virtual Machine Code)方式。即 Java 语言编译后产生的是虚机器码,虚机器码运行在一个解释器上,每一个操作系统均有一个解释器,这样一来,Java就成了平台无关语言。这和 Gosling设计的Sun NeWs窗口系统有着相同的技术味道,在NeWs中用户界面统一用Postscript描述,不同的显示器有不同的Postscript解释器, 这样便保证了用户界面的良好的可移植性。

1994年底,James Gosling参加了在硅谷召开的“技术、教育和设计大会”。他报着试一试的心情向与会者演示了Java的功能。他点击了网页上的一个静止的分子结构图标,一条命令通过互联网送到了几百英里外的网站,下载了一段Java小程序,在本地工作站上开始执行。在几秒钟时间里,原本静止的网页上,一个分子图像以三维动画的方式转了起来。

“哇!”James Gosling听到了全场观众的赞叹声。

不久后,硅谷最大的报纸《圣荷西信使报》在头版刊登了一篇专文,“为什么Sun认为一杯热咖啡能让你鼓足精神”。从文章见报开始,负责Java市场人员的电话响个不停。不久,全美的主要报刊杂志都刊登了Java的报道。

Java出名了!

到了2000年,Java已经成为世界上最流行的电脑语言。绿色小组当初设计Java是为了面向数字家庭,支持各种家电设备。他们没有想到的是,Java支持的计算模式,实际上就是互联网的模式。

对于Java语言的巨大成功,没有人比James Gosling 更加谦逊:“我从来没有想到Java技术将会这么火。当我的老板问我它将达到多少次下载时,我说 10,000 次。而他认为我太过乐观了。”

在2010年甲骨文收购Sun后不久,这位Java编程语言的发明者宣布离职,并在2011年初加入谷歌。 2011年8月30日,高斯林在其博客上宣布离开谷歌,加入开展海洋探测业务的机器人制造公司Liquid Robotics,任首席软件架构师。负责传感器软件开发和自主导航设计,数据中心海量数据处理。


1 Java现状

以下内容,转载自:http://www.365mini.com/page/3.htm
谈到这个问题,对于我这样刚入门编程行业的新人来讲,更关心的问题应该是:学习什么开发语言比较好?以及,选择一门语言之后,该如何高效地学习并掌握此语言?学习完此语言之后,以后的职业发展是什么?

首先必须声明的是,这是一个「仁者见仁,智者见智」的问题,可能每个人都有自己不同的见解,而且我们还不能完全地判定谁对谁错。这个问题并没有所谓「百分之百正确」的答案,但是对于大多数初学者来说,在选择学习哪种开发语言时却常常有这样的疑惑:「我学习哪种开发语言比较好」、「什么开发语言适合做游戏应用」、「什么开发语言适合做网站」、「什么开发语言适合做手机软件」、「什么开发语言最热门」、「Java、PHP、C#哪个好」。在许多技术网站和问答网站上,也有许多类似的讨论,其中一个有趣的现象就是:多数开发人员都会潜意识地认为自己所使用的开发语言是相对而言更优秀的,这正应验了中国的那句古话「情人眼里出西施」。

既然许多初学者有这样的疑惑,作为一个以「编程开发技术分享」为核心的网站自然也应该对此稍作解析。不过必须指出的是:受笔者个人阅历、技术水平等因素所限,笔者在本文中所说的内容并不一定完全正确,也并不完全适用于所有人,在此抛砖引玉仅仅是给各位初学者提供一个参考

1.1 主流语言介绍

在中国,目前相对主流的开发语言主要有Java、PHP、C#、C、C++。

俗话说的好,「学以致用」,我们学习的最终目的就是拿来使用,那么,上述编程开发语言主要用来做什么呢?

1.1.1 Java

Java是一种跨平台的开源的程序设计语言,其编写的程序几乎无需任何更改就可以在Windows、Linux、Mac等多种操作系统平台上运行。

Java具有卓越平台跨平台、多线程、网络编程特性,广泛应用于个人电脑、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

Java可以用来开发Web应用程序(即我们通常所说的「网站」)。其成熟性、稳定性、安全性、可维护性已久经考验,因此比较适合大型网站的开发。国内许多著名的大型网站均是使用Java开发的,例如:淘宝网、支付宝、腾讯网、中国建设银行、中国移动等(note: 现在是2016年11月,事实上,现在的淘宝类的高并发大流量网站,已经不再单一的采用某种解决方案,都是多技术混合方案。)

Java也可以用于开发手机软件,由于其在移动领域仍然具备一定的跨平台优势,因此使用Java开发手机应用或手机游戏比较普遍。手机上许多常见的软件几乎都有对应的Java版本,例如:UC浏览器、移动手机阅读、手机QQ浏览器、中国移动飞信、手机QQ、新浪微博、酷狗叮咚等。

更重要的是,自2005年Google收购Android,并于2008年10月推出第一部Android智能手机以来,由于其自由开放的特性,预装Android系统的智能手机和平板电脑如雨后春笋般层出不穷。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2012年11月数据显示,Android占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。众所周知的是,在Android系统上开发手机应用使用的就是Java,这无疑给Java的移动应用开发领域注入了强大的生命力。

当然,Java也可以用来开发电脑软件,不过由于使用Java开发的电脑软件必须安装Java虚拟机才能运行,使得其在个人用户市场方面显得比较弱势,因此,使用Java开发软件主要是面向企业用户或个人用户中的特定群体。

使用Java开发的电脑软件有:EIOffice(永中Office)、JNode操作系统、合金战士Chrome(纯Java 3D游戏)、Eclipse、PL/SQL Developer、NetBeans、Jbuilder等。

综上所述,Java主要用于Web应用和手机应用的开发。(note: 后期,随着笔者本人技术的进步,会通过自身实际和行业发展角度,来进一步总结,Java在Web和Android方向的优势与不足)

1.2 PHP

PHP是一种跨平台的开源的脚本语言,主要用于开发网站。它是一种简单灵活的编程语言,因此程序开发快,运行快,技术本身学习快。相对于其他语言,PHP编辑简单,实用性强,更适合希望从事网站开发的初学者。

在笔者看来,PHP是一种专为网站开发而生的编程语言(虽然它也包含了命令行运行接口,或者产生图形用户界面的程序)。基于其跨平台、运行快、学习相对简单、开发灵活便捷的特性,PHP在世界范围内的互联网上非常流行,根据W3Techs在2013年1月15日发布的《全球www网站技术报告》(英文:Usage of server-side programming languages for websites),全世界排名(Alexa排名)前100万名的网站中,PHP占据的市场份额为78.8%,排名全球第一。

PHP在全球范围内非常受到个人网站站长和中小型企业的青睐,在国内也不例外。由于PHP开源免费,资源占用低,而且与其密切相关的数据库MySQL、服务器软件Apache或nginx等也都是开源免费的,这使得架设一个PHP网站的成本非常低。许多互联网服务提供商(ISP)纷纷推出了非常廉价的PHP虚拟主机解决方案,用户只需要花费几十元到几千元不等即可打造一个属于自己的网站,甚至有些ISP还推出了有部分条件限制的完全免费的PHP虚拟主机。这进一步促使许多希望从事网站开发的初学者将PHP作为自己的入门首选编程语言。

此外,基于PHP开发的网站内容管理系统(CMS)和论坛系统也层出不穷。网站内容管理系统和论坛系统,顾名思义,即使用户不懂PHP,只需要简单的安装配置,或者设计一些特定的模板样式就可以完成一个网站或论坛的制作,并且具备的功能也非常强大。在所有的网站内容管理系统或论坛系统中,基于PHP开发的产品数量远远高于基于其他语言开发的。并且诞生了许多成熟稳定、高效安全、功能强大的知名产品,例如:

【Discuz!】(非常强大的论坛系统,大多数论坛都使用这个,支持搭建集成论坛(BBS)、社交网络(SNS)、门户(Portal)、群组(Group)、开放平台(Open Platform)应用于一体的Discuz!X一站式服务平台。)
【phpwind】(又一个非常知名的论坛系统,功能强大)
【WordPress】(全球最流行的博客型网站内容管理系统,功能非常强大,现在也支持搭建简单的门户信息型网站,并且有许多开发人员专为其开发插件,插件众多,使用方便。笔者的这个网站就是使用WordPress构建。)
【Joomla! CMS】
【KESION CMS(科汛)】
【Empire CMS(帝国)】
【verycms】
【DEDECMS(织梦)】
【phpcms】
【SuperSite】(可将论坛资源自动转换为门户网站)
【齐博 CMS】
【ShopEx】(国内市场占有率最高的网店系统)
【Zen Cart】(开源网店系统)
【ECShop】(开源网店系统)
【OSCOMMERCE】(开源网店系统)
……
在大型网站应用方面,PHP也有自己的用武之地,尤其是PHP4和PHP5完善了对「面向对象」的支持以来,PHP也逐渐成为一种新的趋势。诸如百度、新浪、腾讯、淘宝、Facebook、Twitter、WikiPedia(维基百科)等也纷纷采用PHP来构建自己的大型网站应用。再随着一系列的PHP开发框架的不断完善和成熟,标志着从个人网站到大型分布式应用系统的基于PHP开发的解决方案业已成熟。

综上所述,PHP主要用于Web应用的开发。

1.3 C#

提到C#(英文发音:C Sharp),就不得不提.NET Framework。.NET Framework(简称.NET或dotNet)是微软开发的一个运行于Windows操作系统的软件开发平台。它是一种采用系统虚拟机运行的编程平台,以通用语言运行库(Common Language Runtime)为基础,从而支持C#、VB、C++、Python等多种语言的开发。微软致力于将.NET打造为一个集敏捷软件开发、快速应用开发、平台无关性和网络透明化于一体的软件开发平台。而在微软的.NET战略中,最具代表性的核心开发语言非C#莫属。

C#是微软于2000年推出的一种基于.NET框架的、面向对象的高级编程语言,由Anders Hejlsberg(安德斯·海尔斯伯格,也是著名的「Delphi之父」)主持研发。

C#语言本身深受Java、C、C++的影响,因此它们在语法等方面具有很大的相似性;此外,C#在诞生之初就被考虑用来对抗甚至取代Sun公司的Java,语法等方面的相似性可以方便那些熟悉Java、C、C++等类似语言的开发人员快速转向C#。 C#吸收了Java、C、C++等语言许多优秀的特性或机制,又摒弃了这些语言中一些不够优雅的特性。

C#可用于开发软件应用以及Web应用。对于许多开发人员来说,一提到C#,可能就会自然而然地联想到「拖拽控件」。没错,「拖拽控件+事件驱动模型」是C#的一个令人印象深刻的标签。使用C#,再结合微软提供的可视化开发工具 (Visual Studio),你可以非常快速高效地开发一个软件或者网站。

由于其开发快速高效的特点,C#极大地降低了企业的人力资源和时间成本,因此C#在中小型企业中非常流行。但是,这并不代表C#不适用于开发大型软件应用或大型网站,在大型应用开发方面,也有诸如微软、新蛋中国、京东、凡客、中国移动(飞信)等许多企业选择C#,只不过在大型应用开发或高性能应用开发中,很少采用「拖拽控件」这种方式,而是采用和其他语言一样的自行编码方式。

简单的说,C#和其他语言一样可以自行编码开发,除此之外,它还可以借助于Visual Studio等可视化工具采用「拖拽控件+事件驱动模型」的方式进行更快速高效的程序开发(其实, 其他语言也可以实现这种开发方式,但一般都是第三方的开发工具实现,官方支持较少,开发工具不够统一,也不像C#这样具备先天优势,使用流行程度自然也没有C#这样风靡)。

在移动终端领域,C#也保持了其开发快速简单的特点,结合微软推出的基于DirectX的游戏开发环境XNA。配合微软的开发工具XNA Game Studio,C#可以非常方便快捷地开发出适用于Windows Mobile、Windows Phone、Xbox等平台的软件应用或游戏应用(第三方的Mono也有对应的工具可以将C#程序移植到iOS或Android系统上运行)。而且,众所周知的是,微软最近正在卖力地推广它的Windows Phone。

如果抛开一切非技术方面的因素,C# 可能是这个星球上有史以来最好的编程语言,它几乎集中了所有关于软件开发和软件工程研究的最新成果。面向对象、类型安全、组件技术、自动内存管理、跨平台异常处理、LINQ、LAMBDA、版本控制、代码安全管理……你不可能在另外的一种语言中找到所有这些特性,而且微软给了Anders Hejlsberg的开发团队足够的自由,所以我们还能不断看到一些令人振奋的新特性被添加到C#中。但现实的情况是,非技术的因素往往更能决定一个产品的未来,尤其在计算机软件的历史上,技术卓越的产品,如OS/2、Mac OS、UNIX等,都败在了Windows那漂亮的外观下(这里仅指大众消费群体方面)。

就目前的状况而言,C#和Java一样,都必须运行在自己特定的运行环境上:Java依赖于Java虚拟机,C#依赖于.NET Framework。要运行Java或C#程序就必须先安装对应的运行环境,这既是它们的优点,也是它们的缺点。无论如何,这限制了它们在个人用户市场的充分发展,毕竟「为了使用一个几十KB或几MB的小程序就不得不先安装一个几十MB或几百MB的运行环境」并不怎么受用户欢迎。

此外,C#并不是一门开放源代码的语言,并且还只能运行在微软自己的Windows操作系统上;在移动终端领域也是如此,都是运行在自家的系统平台上(通过第三方的编译程序,例如Mono C#,可以让C#程序在Linux、Mac OS X等平台上运行)。当然,这是微软出于商业利益等多方面考虑的决定,不过,这或多或少限制了C#的发展。因此,在C#的活动场所,很少看到IBM、Oracle、谷歌、苹果等互联网或计算机技术巨头的身影,毕竟它们不会傻到为自己的竞争对手做嫁衣。而且,我们惊奇地发现,或许是由于添加了许多新特性的缘故,.NET Framework的不同版本之间并不完全兼容。举个例子,在默认情况下,基于.NET 2.0 的C#程序在.NET 4.0的运行平台上无法直接运行。微软的新策略是强烈建议程序在开发时使用的运行时版本下运行,这样可以保证最大的兼容性。这就使得用户想要运行基于不同.NET版本的C#程序,还得「家中常备」多个版本的.NET Framework。

不管怎么说,微软仍然在尽量地解决上述不足。我们也看到,除了Windows XP及更早的操作系统之外,微软开始在Windows操作系统中以功能组件的形式内置.NET Framework。比如:

Windows Server 2003 预装.NET 1.1
Windows Server 2003 R2 预装.NET 2.0
Windows Vista 预装.NET 3.0(包含.NET 2.0)
Windows Server 2008 预装.NET 3.0(包含.NET 2.0)
Windows 7 预装 .NET 3.5(包含.NET 2.0和 3.0)
Windows 8 预装 .NET 4.5和.NET 3.5(包含.NET 2.0和3.0)
Windows Server 2012 预装 .NET 4.5和.NET 3.5(包含.NET 2.0和3.0)
(注意,以上只是一般情况,并不排除家庭版、OEM版、专业版、企业版、旗舰版以及「破解版」、「纯净绿色版」之间存在差异。)
从上面的.NET预装情况,我们可以看出,为了解决.NET版本之间的兼容问题,微软在预装新版本的.NET时,都会包含进.NET 3.0或.NET 2.0等旧版本。不过,略显遗憾的是,微软预装的.NET Framework在默认情况下并没有启用(或没有完全启用)。

在C#发行之初,微软就已经向ECMA申请将C#作为一种标准。2001年12月,ECMA发布了ECMA-334 C#语言规范。但是正如微软.Net 框架部的产品经理Tony Goodhew说:「有些政府组织认可ISO认证的软件,而不承认 ECMA的认证软件。」 例如澳大利亚就规定,符合ISO规范可以自动符合澳大利亚本国规范。基于此,微软向ISO(国际标准化组织)提交了申请,并于2003年成为一个ISO标准(ISO/IEC 23270)。这使得C#更容易被一些国家或企业接受。

综上所述,无论是开发软件应用、Web应用还是手机应用,C#都是一支优秀的生力军。不过到目前为止,它仍然在很大程度上被约束在微软自己的平台上。从预装.NET、提交ISO标准等行为来看,微软正在尝试尽量解除对C#的部分束缚。 如果微软能够最终解决上面我们提到(或未提到)的这些不足,使C#更加开放,尤其是在所有的Windows操作系统中内置.NET Framework并且默认启用,那么我们就可以非常明确地说:C#的春天到了。

2 Java各版本主要技术的更迭总结

转载自:http://www.365mini.com/
Java语言在发展的过程中,经历了多次的演变,Java标准库中也不断新增了大量的Package(包)和Class(类)。那么在其发展过程中,到底经历了哪些改变呢?

2.- 1995年5月23日,Java 语言诞生

在Java语言诞生初期,公开发行的Alpha和Beta版本的JDK拥有非常不固定的API(Application Programming interface)和ABI(Application binary interface) 。当时,Sun对外提供的Java Web浏览器被命名为WebRunner(后改名为HotJava)。

2.0 JDK 1.0(1996年01月23日)

代号Oak(橡树),是Java的初始发行版本。JDK 1.0.2是Java的第一个稳定版本,因此它也被叫做Java 1。

备注:在JDK 1.0.1版本中,你可以一起使用private和protected修饰符来创建另一种形式的保护,它只允许该类的子类访问对应的方法或变量。不过,在JDK 1.0.2版本中,这种创建方式又被移除了。

2.1 JDK 1.1 (1997年02月19日)

主要更新内容包含如下:

  • 对AWT(java.awt)事件模型进行大范围的改进。
  • 新增内部类。
  • 添加JavaBean。
  • 添加JDBC。
  • 添加RMI(Java remote method’s invocation/Java远程方法调用)。
  • 添加只支持内省(Introspection),但不允许在运行时改动的Java反射机制。
    J2SE 1.2 (1998年12月04日)

2.2 JAVA2(1999年6月)

 代号Playground(运动场)。该版本以及一直到J2SE 5.0为止的后续版本被回顾性地称作Java 2。此外,版本名称「J2SE」也取代了「JDK」,用来和以J2SE为基础的J2EE、J2ME进行区分。因为,从该版本开始,JDK被细分为3个不同的平台版本:J2SE(Java 2 Platform,Standard Edition/标准版)、J2EE(Java 2 Platform,Enterprise Edition/企业版)、J2ME(Java 2 Platform,Micro Edition/微型版、移动版)。

该版本是Java平台上意义非常重大的一次更新,Java平台增至59个包,共1520个类,是以前版本的3倍大小。其主要更新内容如下:

  • 新增关键字strictfp(意即strict float point)。
  • 核心类中集成Swing图形API。
  • Sun公司的JVM首次采用JIT(just-in-time)编译器。
  • 添加Java插件。
  • 添加可与CORBA协同交互的Java IDL。
  • 添加Collections集合框架体系。
    J2SE 1.3 (2000年05月08日)

2.3 JDK1.3 (2000年5月8日) 

代号Kestrel(茶隼,红隼),最值得注意的更新内容如下:

  • 内置HotSpot JVM。
  • 改进RMI(Java remote method’s invocation)对CORBA的兼容性。
  • 添加JavaSound API(javax.sound.midi和javax.sound.sampled),提供对语音处理的支持。该平台以前的版本只有有限的音频支持,只能对音频片段进行基本播放。 在此新版本中,Java 2 平台定义了一系列标准类和接口,用于低级音频支持。
  • JNDI(Java Naming and Directory Interface/Java命名和目录接口)已经进入核心库(以前只能通过扩展方式使用)。
  • 添加JPDA(Java Platform Debugger Architecture/Java平台调试器体系),为调试Java代码提供了统一的API。
  • 新增复合代理类(Synthetic proxy classes)

2.4 J2SE 1.4 (2002年02月13日)
代号Merlin(灰背隼),这是Java平台在JCP(Java Community Process)下基于JSR 59规范开发的第一个版本。主要更新内容如下: 
  • 新增assert关键字。
  • 新增模仿Perl正则表达式的Java正则表达式。
  • 新增Exception Chaining(异常链)机制,允许一个异常封装最初的低级异常。
  • 添加对网络协议IPv6的支持。
  • 新增nio(java.nio),意即非阻塞式的I/O(non-blocking I/O)。由于nio是不同于以往I/O的一种新的API,因此也被称作New I/O。
  • 新增日志API(java.util.logging)。
  • 新增图像I/O API,用于支持类似于JPEG、PNG等格式的图像的读写操作。
  • 集成XML解析器和XSLT处理器。
  • 集成安全加密等扩展。
  • 内置Java Web Start软件,使你可以方便地从Web下载和运行Java应用程序。
  • 新增配置参数API(java.util.prefs),它允许应用程序存储并获取用户和系统首选项和配置数据。

2.5 J2SE 5.0 (2004年09月29日)

代号Tiger(老虎)


2.6 Java SE 6 (2006年12月11日)

代号Mustang(野马

2.7 Java SE 7 (2011年07月28日)

Java 7,代号「海豚(Dolphin)」,是Java历史上一次非常重大的版本更新。Java 7 由Sun公司(2009年4月20日被Oracle以74亿美元收购)于2011年7月7日首次推出,并于2011年7月28日正式面向开发人员发布。Java 7 的开发周期分为13个阶段,并于2011年2月18日全部达成。平均每个阶段又更新发布了8个内部小版本,每个版本主要进行功能增强和bug修复。

Java 7 在Java 6的基础上对性能进行了进一步优化完善,部分功能得以进一步增强,此外还在基础语法上进行了一系列改进。那么Java 7 到底做了哪些更新,又有些什么令人惊喜振奋的新特性呢?Oracle在其官方网站上公布了《Java SE 7 Features and Enhancements》,其中详细介绍了Java SE 7 中所有主要的新特性和功能增强。不过原网站上全是密密麻麻的的英文,而且英文非常简洁,这让类似于笔者这样半吊子水平的中国Java爱好者只能望文兴叹,直呼「伤不起」。

Java 7 新特性及更新内容详情如下:

  • 二进制形式的字面值表示
  • 在数值类型的字面值中使用下划线分隔符联接
  • 创建泛型实例时自动类型推断
  • switch-case语句支持字符串类型
  • 新增try-with-resources语句
  • 单个catch子句同时捕获多种异常类型
  • 改进使用带泛型可变参数的方法时的编译器警告和错误提示机制

Swing:
* 新增javax.swing.JLayer 类,一个灵活而且功能强大的Swing组件修饰器。它使你能够直接利用组件和组件的事件响应而无需修改底层组件。你可以点击查看如何使用JLayer修饰组件。
* Nimbus Look & Feel (L&F) 从包com.sun.java.swing移动到标准的API包javax.swing;详细信息请查看javax.swing.plaf.nimbus。 尽管它不是默认的L&F,但是现在你可以非常方便地使用它了。你可以查看Java教程中Nimbus Look and Feel部分的详细信息,也可以在你的程序中运行三个使用Nimbus的简单方法的代码示例。
* 在以前的版本中, 在同一个容器中混合使用重量级的AWT组件和轻量级的Swing组件可能会引发某些问。不过,现在你可以在Java SE 7完美地混合使用它们了。你可以点击这里查看相关文章。
* Java SE 7 支持以指定的透明度或非矩形的方式来显示窗体,你可以点击这里查看Java教程中关于如何创建带有指定透明度和非矩形的窗体的部分内容。
* 类javax.swing.JColorChooser中新增了对以HSV方式来表现RGB色彩模型的支持。HSV和HSL是两种最常见的用于表示RGB色彩模型的表示方式。它们均表示色调、饱和度、亮度三个参数,不过取值形式不同。HSL的三个参数的取值范围均为0-255,HSV的三个参数的取值范围分别为0°-360°、0.0-1.0、0.0-1.0。

Java I/O:
* 包java.nio.file以及相关联的包java.nio.file.attribute提供对文件IO以及访问文件系统更全面的支持。JDK7也支持zip压缩格式的文件系统。你可以参考以下资源获得更多信息:
* 你可以点击查看Java教程中关于文件I/O(NIO 2.0特性)的部分内容;nio表示非阻塞式的IO(non-blocking I/O)。
* 开发一个自定义的文件系统提供者。
* zip压缩格式的文件系统提供者。
* 目录%JAVA_HOME%/sample/nio/chatserver/下含有包括java.nio.file包在内的新API的演示示例。
* 目录%JAVA_HOME%/demo/nio/zipfs/下含有NIO 2.0网络文件系统的演示示例。

网络:
* 类java.net.URLClassLoader新增close方法,该方法可以有效解决如何支持从特定代码库,尤其是jar文件中,加载类或资源的最新实现的问题。详情查看如何关闭URLClassLoader。

安全:
* 新增ECDSA/ECDH等基于ECC加密算法的支持,详情查看Java加密体系结构中供应商SunEC提供支持的算法的部分内容。
* 禁用了MD2等一些弱加密算法,Java SE 7提供一种机制,用于在处理证书路径或与TLS交互时拒绝使用指定的加密算法。详情查看Java公共密钥程序员指南中的附录D:禁用指定的加密算法和Java安全套接字扩展中的禁用加密算法。
* 对Java安全套接字扩展(Java Secure Socket Extension)中的SSL/TLS进行了一系列增强和完善。

并发:
* 基于类java.util.concurrent.ForkJoinPool的fork/join框架,作为接口java.util.concurrent.Executor的一个实现,它被用来高效地运行工作线程池中的大量任务。其中还使用了一种名为work-stealing的技术,它可以充分利用多处理器来保证所有的工作线程一直正常工作。详情查看Java教程中的Fork/Join部分。目录%JAVA_HOME%/sample/forkjoin/中包含fork/join的演示示例。
* 新增java.util.concurrent.ThreadLocalRandom类,它消除了使用伪随机数的线程之间的竞争。在多线程并发访问的情况下,使用ThreadLocalRandom比使用Math.random()可以减少并发线程之间的竞争,从而获得更好的性能。例如:
1. int r = ThreadLocalRandom.current().nextInt(4, 77);
2. //将返回一个4-77之间的随机整数(不包含77)。
* 新增java.util.concurrent.Phaser类,它是一个新的类似于java.util.concurrent.CyclicBarrier的线程同步障碍辅助工具类(它允许一组线程互相等待,直到到达某个公共屏障点)

Rich Internet Application(RIA)/部署:
暂略。

Java 2D:

  • 一个新的基于XRender的渲染管道能够提供改进的图形运行性能,以支持现在的基于DirectX 11的桌面应用。默认情况下,这个渲染管道并未启用,不过你可以使用命令行设置属性-Dsun.java2d.xrender=true来启用它。
  • 现在JDK可以通过诸如GraphicsEnvironment.getAvailableFontFamilyNames等方法来枚举并显示系统中已安装的OpenType/CFF字体了,并且这些字体都可以被方法Font.createFont识别。你可以查看Java教程选择指定的字体。
  • 类java.awt.font.TextLayout现在可以支持西藏文字的脚本了。
  • 在Windows和Solaris操作系统中,文件fontconfig.properties中静态指定了JDK可以使用的逻辑字体。不过,在多数Linux系统的实现中,并没有保证在特定的语言环境下对特定字体表现的支持。在Java SE 7中,libfontconfig可选择在「未识别」的Linux平台上使用的逻辑字体。更多信息可以查看Fontconfig。

Java XML:
* Java SE 7 现在已经更新Java API for XML Processing (JAXP)至1.4.5版本,与以前的版本相比,该版本修复了许多bug,并且做了许多的改进,尤其是在一致性、安全性和性能方面。虽然JAXP仍然处于1.4版本,不过StAX已经升级到了1.2版本。更多信息你可以查看JAXP 1.4.5发行说明以及JAXP 1.4.5更新日志。
* Java SE 7更新Java Architecture for XML Binding (JAXB)至2.2.3版本,详情查看2.2以上版本的JAXB更新日志。
* Java SE 7 更新 Java API for XML Web Services (JAX-WS)至2.2.4版本。详情查看2.2以上版本的JAX-WS更新日志。

国际化:
* Java SE 7中添加或改进了对Unicode 6.0.0、本地化目录、本地化类文件以及ISO 4217货币符号扩展性的支持。

Java lang包:
* Java SE 7 修复了以前版本中多线程的自定义类加载器可能出现死锁的问题。

Java 虚拟机:
* java虚拟机支持非Java语言
* G1(Garbage-First)垃圾收集器
* Java HotSpot虚拟机性能增强

JDBC 4.1:
* 支持使用 try-with-resources 语句进行自动的资源释放,包括连接、语句和结果集
* 支持 RowSet 1.1

Java SE 8 (2014年03月18日)

Java 8,代号 Spider,是自 Java SE 5以来最重要的一次更新。以下只列出更新的名称,不做详细介绍:

  1. Lambda 表达式和函数式编程
  2. 接口的默认方法和静态方法
  3. 重复注解
  4. Java 8引入了新的Date-Time API(JSR 310)来改进时间、日期的处理。
  5. Java8版本新增了很多新的方法,用于支持并行数组处理
(note: 随着笔者学习的深入,以后会专门分析和对于不同版本的区别,并剖析为什么要增加这些新特性,主要应用的方向)

版权声明:本文为lv_shulun原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。