Java是由Sun Microsystems公司(简称Sun公司)于1995 年 5 月推出的 Java程序设计语言和Java平台的总称。Java语言是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由当时任职太阳微系统的 詹姆斯 · 高斯林 (James Gosling)等人于1990年代初开发,它最初被命名为Oak(橡树)。 Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

Java从第一个版本诞生到现在(本书所著时间)已经有24年的时间了。在这23年里诞生了无数和Java相关的产品、技术和标准,现在让我们走入时间隧道,从孕育Java语言的时代开始,回顾一下 Java的发展轨迹和历史变迁。

1991年4月,由James Gosling博士领导的绿色计划(Green Project)开始启动,此计划的目的是开发一种能够在各种消费性电子产品(如机顶盒、冰箱、收音机等)上运行的程序架构。这个计划的产品就是Java语言的前身——Oak,Oak当时在消费品市场上并不算成功,但随着1995年互联网潮流的兴起, Oak迅速找到了最适合自己发展的市场定位并蜕变成为 Java语言。

1992 年3月,由于Oak已被用作另一种已存在的编程语言名称,因此必须选一个新的名字——Java. Java 的灵感来源于咖啡,据说James Gosling 研发小组的工程师经常喝的咖啡就产自印度尼西亚的爪哇岛(Java)上所种植的咖啡豆。

1993年2月, Sun Microsystems的子公司 FirstPerson试图从时代华纳获得一个电视机顶盒交互系统的一系列订单。在那时,由于绿色计划不是很成功,随即失去了时代华纳的订单,于是开发的重心从家庭消费电子产品转移到了电视机顶盒的相关平台上。

1995年5月23日, 0ak语言更名为Java,并且在 Sun World大会上正式发布Java 1.0版本。Java 语言第一次提出了“Write Once, Run Anywhere”的口号。

1996年1月23日,JDK 1.0发布,Java语言有了第一个正式版本的运行环境.JDK 1.0提供了一个解释执行的Java 虚拟机实现(Sun Classic VM) 。JDK1.0版本的代表技术包括 Java虚拟机、Applet 以及 AWT等。

1996年4月,10个最主要的操作系统供应商申明,将在其产品中嵌入Java 技术。同年9月,已有大约8.3万个网页应用了 Java技术来制作。在1996年5月底,Sun 公司于美国旧金山举行了首届JavaOne大会,从此JavaOne成为全世界数百万Java语言开发者每年一度的技术盛会。

1997年2月19日, Sun公司发布了JDK 1.1, Java 技术的一些最基础的支撑点9(如 JDBC等)都是在JDK1.1版本中发布的 JDK 1.1版的技术代表有JAR文件格式、JDBC、 JavaBeans 和 RMI. Java语法也有了一定的发展,如内部类(Inner Class)和反射(Reflection)都是在这个时候出现的。

从1.1.47后,每个JDK版本都有一个自己的名字(工程代号),分别为JDK 1.1.4 - Sparkler (宝石)JDK1.1:5- Pumpkin(南瓜) JDK1.1.6- Abigail(阿比盖尔,女子名)、JDK1.1.7- Brutus(布鲁图,古罗马政治家和将军)和JDK1.1.8- Chelsea(切尔西,城市名)

1998年12月4日,JDK迎来了一个里程碑式的版本JDK1.2, 工程代号为Playground(竞技场)Sun公司在这个版本中把Java 技术体系拆分为3个方向,分别是面向桌面应用开发的J2SE (Java 2 Platform, StandardEdition)、面向企业级开发的J2EE (Java 2 Platform, Enterprise Edition)和面向手机等移动终端开发的J2ME (Java 2 Platform, Micro Edition)。在这个版本中出现的代表性技术非常多,如EJB、Java Plug-in、Java IDL 以及 Swing等,并且这个版本中Java 虚拟机第一次内置了 JIT (Just In Time)编译器(JDK 1.2中曾并存过3个虚拟机, Classic VMs HotSpot VM 和 Exact VM, 其中 Exact VM 只在 Solaris平台出现过:后面两个虚拟机都是内置JIT编译器的,而之前版本所带的 Classic VM只能以外挂的形式使用JIT编译器)。在语言和API级别上,Java 添加了 strictfp关键字与现在 Java编码之中极为常用的一系列 Collections集合类。在1999年3月和7月,分别有JDK 1.2.1和JDK1.2.2两个小版本发布。

1999年4月27日, HotSpot 虚拟机发布。HotSpot 最初由一家名为“Longview Technologies"的小公司开发,因为 HotSpot 的优异表现,这家公司在1997年被Sun公司收购了。HotSpot 虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK1.3及之后所有版本的Sun JDK 的默认虚拟机。

2000年5月8日,工程代号为 Kestrel(美洲红)的JDK 1.3发布,JDK 1.3相对于JDK 1.2的改进主要表现在一些类库上(如数学运算和新的 Timer API等),JNDI服务从JDK 1.3开始被作为一项平台级服务提供(以前JNDI仅仅是一项扩展),使用CORBA IIOP来实现RMI的通信协议等。这个版本还对 Java 2D做了很多改进,提供了大量新的 Java 2D API,并且新添加了 JavaSound类库。JDK 1.3有一个修正版本JDK 1.3.1,工程代号为 Ladybird(瓢虫),于2001年5月17日发布。

从MJDK1.3开始, Sun 公司维持了一个习惯:大约每隔两年发布一个JDK的主版本,以动物名作为工程代号,期间发布的各个修正版本则以昆虫名作为工程代号。

2002年2月13日, JDK1.4发布,工程代号为Merlin (灰背)。

2002年9月16日,发布了工程代号为Grasshopper (蚱蜢)的JDK 1.4.1。

JDK1.4是Java真正走向成熟的一个版本,Compaq、 Fujitsu、 SAS、 Symbian 以及IBM等著名公司都有参与甚至实现自己独立的JDK 1.4。哪怕是在十多年后的今天,仍然有许多主流应用(Spring、 Hibernate 以及 Struts等)能直接运行在JDK 1.4之上,或者继续发布能运行在JDK 1.4上的版本。

2003年6月26日,发布了工程代号为Mantis(螳螂)的JDK1.4.2。

2004年9月30 日,JDK1.5发布,工程代号 Tiger(老虎)。从JDK 1.2发布以来,Java在语法层面上的变换一直很小,而JDK1.5在 Java语法易用性上做出了非常大的改进。例如,自动装箱、泛型、动态注解、枚举、可变长参数以及遍历循环(foreach 循环)等语法特性都是在JDK 1.5中加入的。在虚拟机和API层面上,这个版本改进了 Java的内存模型(Java Memory Model, JMM),提供了 java.util.concurrent 并发包等。另外,JDK 1.5是官方声明可以支持Windows 9x平台的最后一个JDK版本。

2006年12月11日,JDK1.6发布,工程代号 Mustang(野马)。在这个版本中,Sun公司终结了从JDK 1.2开始已经有8年历史的J2EE、J2SE 和 J2ME的命名方式,启用Java SE 6、 Java EE 6和Java ME 6的命名方式。JDK 1.6的改进包括提供动态语言支持(通过内置 Mozilla Java Rhino引擎实现)、提供编译API 和微型HTTP服务器API等。同时,这个版本对Java 虚拟机内部做了大量改进,包括锁与同步、垃收集以及类加载等方面的算法都有相当多的改动。

2006年11月13日的 JavaOne大会上,Sun 公司宣布最终会将Java开源,并在随后的一年多时间内,陆续将JDK的各个部分在GPL v2 (GNU General Public License v2)协议下公开了源码,并建立了OpenJDK组织对这些源码进行独立管理。除了极少量的产权代码外(Encumbered Code,这部分代码大多是Sun公司本身也无权限进行开源处理的),OpenJDK几乎包括了Sun JDK的全部代码外,OpenJDK的质量主管曾经表示,在JDK 1.7中,Sun JDK 和 OpenJDK 除了代码文件头的版权注释之外,代码基本上完全一样,所以OpenJDK7与Sun JDK 1.7本质上就是同套代码库开发的产品。

JDK1.6发布以后,由于代码复杂性的增加、JDK开源、开发 JavaFX、经济危机及Sun 公司收购案等原因,SUN公司在JDK发展以外的事情上耗费了很多资源,JDK的更新没有再维持两年发布一个主版本的发展速度。JDK1.6到目前为止一共发布了37个 Update版本,最新的版本为 Java SE 6 Update 37, 于2012年10月16日发布,2009年2月19日,工程代号为Dophin (海豚)的JDK 1.7完成了其第一个里程碑版本。 根据 JDK 1.7 的功能规划,一共设置了 10个里程碑。最后一个里程碑版本原计划于2010年9月9日结束,但由于各种原因JDK1.7最终无法按计划完成。

MJDK1.7最开始的功能规划来看,它本应是一个包含许多重要改进的JDK版本,其中的 Lambda 项目 (Lambda表达式、函数式编程)、Jigsaw项目(虚拟机模块化支持)、动态语言支持、GarbageFirst 收集器和 Coin项目(语言细节进化)等子项目对于 Java业界都会产生深远的影响。在JDK1.7开发期间, Sun 公司由于相继在技术竞争和商业竞争中都陷入泥潭,公司的股票市值跌至仅有高峰时期的3%, 已无力推动 JDK1.7的研发工作按正常计划进行。为了尽快结束JDK 1.7长期“跳票”的问题,Oracle公司收购Sun 公司后不久便宣布将实行“B计划”

大幅裁剪了JDK 1.7 预定目标,以便保证JDK 1.7的正式版能够于2011年7月28日准时发布。“B计划”把不能按时完成的 Lambda 项目、Jigsaw项目和Coin项目的部分改进延迟到 JDK 1.8之中。最终,JDK 1.7的主要改进包括提供新的G1收集器(G1 在发布时依然处于 Experimental状态,直至2012年4月的 Update 4 中才正式“转正”)、加强对非 Java语言的调用支持(JSR-292,这项特性到目前为止依然没有完全实现定型)以级类加载架构等。

到目前为止, JDK 1.7已经发布了9个 Update版本,最新的 Java SE 7 Update 9于 2012年 10月16日发布。

从 Java SE 7 Update 4起, Oracle开始支持Mac OSX操作系统,并在 Update6中达到完全支持的程度,同时在 Update 6中还对ARM指令集架构提供了支持。至此,官方提供的JDK可以运行于 Windows(不含Windows9x) s Linux, Solaris和 Mac OS 平台上,支持ARM、 x86、x64 和 Sparc指令集架构类型。

由于此前 Oracle 公司已经收购了另外一家大型的中间件企业BEA公司,在完成对 Sun 公司的收购之后, Oracle    公司分别从BEA公司和Sun 公司中取得了目前三大商业虚拟机的其中两个—JRockit和 HotSpot, Oracle公司宣布在未来1~2年的时间内,将把这两个优秀的虚拟机互相取长补短,最终合二为一。由此可以预见在不久的将来, Java 虚拟机技术将会产生相当巨大的变化。

2011年7月28日, Oracle 公司发布 Java SE 1.7。

2014年3月18日, Oracle 公司发布Java SE 1.8。

2017年9月22日, Java SE 1.9正式发布。Java 9提供了一个全新的模块系统,它的核心变化就是引入了一种新的 Java编程组件,也就是模块化。Java 9提供了轻量级JSON API;使用G1作为默认的垃圾收集器,替代了之前默认使用的 Paralel GC; 引入了 jshel这个交互性工具,jshel 为Java带来了读入一一求值一一打印一一循环的功能。它的目的在于以即时结果和反馈的形式,简化原型的实现并帮助我们探索语言在编码时的可选项;对os process拥有更好的控制和管理方式; 全面支持Http 2.0,以所谓的孵化器模块交付,并且为Java配备一个全新的 Http客户端来替代 HttpURLConnection,同时还实现 Http 2.0 和 websockets。

2009年4月20日, Orcle公司宣布正式以74亿美元的价格收购Sun 公司, Java商标从此正式归Oracle公司所有(Java语言本身并不属于哪个公司所有,它由JCP组织进行管理,尽管JCP主要是由Sun 公司或者说 Oracle 公司所领导的)。

Java的发展简史的更多相关文章

  1. ***Java多线程发展简史

    http://blog.jobbole.com/28297/ 本文来自四火的博客(@RayChase),由@_Zhijun 推荐 这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的 ...

  2. [转] Java多线程发展简史

    这篇文章,大部分内容,是周五我做的一个关于如何进行Java多线程编程的Knowledge Sharing的一个整理,我希望能对Java从第一个版本开始,在多线程编程方面的大事件和发展脉络有一个描述,并 ...

  3. java 发展简史

    [0]README 0.1) 本文转自 core java volume 1,仅供了解Java 的发展历史,它的前世今生,所谓知己知彼,百战不殆(just a joke) : [1]java 发展简史 ...

  4. Java 发展简史:初生遇低谷,崛起于互联网

    Java 起源与诞生 20世纪90年代,单片式计算机系统诞生,单片式计算机系统不仅廉价,而且功能强大,使用它可以大幅度提升消费性电子产品的智能化程度. SUN公司为了抢占市场先机,在1991年成立了一 ...

  5. 3.java发展简史

    1991年,James Gosling在SUN(Stanford University Network)公司的工程师小组想要设计这样一种小型计算机语言.该语言主要用于像电视盒这样的消费类电子产品.另外 ...

  6. Web前端发展简史

    Web前端发展简史 有人说“前端开发”是IT界最容易被误解的岗位,这不是空穴来风.如果你还认为前端只是从美工那里拿到切图, JS和CSS一番乱炖,难搞的功能就去网上信手拈来,CtrlC + Ctrl ...

  7. Java的发展历程

    Java的发展历程充满了传奇色彩. 最初,Java是由Sun公司的一个研究小组开发出来的, 该小组起先的目标是想用软件实现对家用电器进行集成控制的小型控制装置. 开始,准备采用C++,但C++太复杂, ...

  8. Web发展简史(精编故事版,贤来给你讲故事)

    Web发展简史 一. Web发展简史之隔壁老王的故事 有一个人叫隔壁老王,老王有一个爱好就是爱看电影.有一天,这个隔壁老王想看一部电影,可是电脑里面存储的电影太多了,他费了老大劲才从里面找到,觉得很不 ...

  9. 发展简史jQuery时间轴特效

    发展简史jQuery时间轴特效.这是一款鼠标滚动到一定的高度动画显示企业发展时间轴特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="wr ...

随机推荐

  1. Oracle trunc和round的区别

    1.关于trunc 和round函数比较 整体概括: round函数 四舍五入trunc函数 直接截取 对于时间: Round函数对日期进行"四舍五入",Trunc函数对日期进行截 ...

  2. 【编程思想】【设计模式】【行为模式Behavioral】模板模式Template

    Python转载版 https://github.com/faif/python-patterns/blob/master/behavioral/template.py #!/usr/bin/env ...

  3. 【Linux】【Shell】【Basic】条件测试和变量

    bash脚本编程       脚本文件格式:         第一行,顶格:#!/bin/bash         注释信息:#         代码注释:         缩进,适度添加空白行:   ...

  4. 带你揭开WebSerivce的面纱

    最近在工作中遇到这样的一个项目(暂且定为项目A),项目A本身是用PHP开发的,但是其数据是来自于另一个使用java开发的项目(暂且定为项目B),项目A不能操作项目B的数据库,它有其自己的一套数据库,只 ...

  5. Mybatis中对象关系映射

    在实际开发中,实体类之间有一对一.一对多.多对多的关系,所以需要正确配置它们对应关系,Mybatis通过配置文件能够从数据库中获取列数据后自动封装成对象. 如:一个订单Orders类对应一个用户Use ...

  6. picoctf_2018_rop chain

    拿到题目就知道要用rop来做 老样子日常检查一下 32位的程序开启了nx和relro保护 将程序放入ida中 一眼就看到了程序中的后门程序 我们逐一分析一下 main vuln get没有对输入字符进 ...

  7. oracle同义词创建(synonym)

    oracle同义词创建(synonym)   在现在的项目中会有很多接口,数据来源也可能是不同数据库或者是不同的用户下的表,给访问该表带来了一定的麻烦.这个时候就可以使用同义词来简化. 同义词的语法是 ...

  8. Sharepoint 列表分页开发

    虽然现在linq技术对列表操作都是对实体操作了,但是linq有一点不好,那就是分页舞从下手,假如查出满足条件的记录有1万条,而在分页的时候我每次只需要显示10条,那么我每次点击下一页的时候都查询的是1 ...

  9. Spring学习(二)三种方式的依赖注入

    1.前言 上一篇讲到第一个Spring项目的创建.以及bean的注入.当然.注入的方式一共有三种.本文将展开细说. 1.set注入:本质是通过set方法赋值 1.创建老师类和课程类 1.Course ...

  10. JAVA中Map集合遍历

    for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("key= " ...