Java 简介及各版本特性
Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。
Java分为三个体系:
- JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版)
- JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版)
- JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版)。
发展历史
- 1991 年 Green项目成立,Sun公司的James Gosling等人开始开发名称为 Oak 的语言。希望用于控制嵌入在有线电视交换盒、PDA等的微处理器
- 1994年将Oak语言更名为Java
- 1995年5月23日,Java语言诞生
- 1996年1月23日,Sun公司发布了Java的第一个开发工具包JDK 1.0
- 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
- 1996年9月,约8.3万个网页应用了JAVA技术来制作
- 1996年10月,Sun发布第一个JIT编译器
- 1997年2月18日,JDK1.1发布
- 1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
- 1997年9月,JavaDeveloperConnection社区成员超过十万
- 1998年2月,JDK1.1被下载超过2,000,000次
- 1998年12月8日,Sun公司发布了第二代Java平台(简称为Java2)的3个版本:J2ME(Java2 Micro Edition,Java2平台的微型版),应用于移动、无线及有限资源的环境;J2SE(Java 2 Standard Edition,Java 2平台的标准版),应用于桌面环境;J2EE(Java 2Enterprise Edition,Java 2平台的企业版),应用于基于Java的应用服务器。
- 1999年6月,SUN公司发布Java的三个版本:标准版(JavaSE,以前是J2SE)、企业版(JavaEE以前是J2EE)和微型版(JavaME,以前是J2ME)
- 2000年5月8日, JDK1.3,J2SE 1.3发布
- 2000年5月29日,JDK1.4 发布
- 2001年9月24日,J2EE1.3 发布
- 2002年2月26日,J2SE1.4 发布
- 2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0(内部版本号1.5.0)
- 2005年6月,JavaOne大会召开,SUN公司公开JavaSE6,版号与名称全改,取消J2,J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME。而JDK6全称为Java SE Development Kit6。6是产品版本号,1.6是开发者版本号。
- 2009年04月20日, Oracle公司每股7.5美元收购Sun 总价值 74亿美元
- 2011年7月28日,Oracle发布Java SE 7
- 2014年3月18日,Java SE 8 发布
- 2017年9月21日,Java SE 9 发布
- 2018年3月21日,Java SE 10 发布
- 2018年9月25日,Java SE 11 发布
- 2019年3月20日,Java SE 12 发布
- 2019年9月17日,Java SE 13 发布
- 2020年3月17日,Java SE 14 发布
主要特性
- 简单:java语言是从C++发展起来的,取消了C++中复杂难以掌握的部分,如指针。
- 面向对象:java语言的基础。java将一切问题都看做对象与对象之间的交互,将对象抽象成方法与属性的集合。
- 分布性:包含操作分布性与数据分布性两个方面。操作分布性是指由多个主机共同完成一项功能,数据分布性是分布在多台主机上的数据当做一个完成的整体处理。
- 跨平台:java语言编写的应用程序,不受平台限制,可以由一种平台迁移到另一种平台。
- 解释型:使用java语言编写的源码被转化为字节码,字节码只有被JVM解释成机器码才能被计算机执行。
- 安全性:java语言的底层设计可以有效避免非法操作。
- 健壮性:java提供了许多机制防止运行时出现严重错误,如编译时类型检查、异常处理。
- 多线程:java支持多线程,允许进程内部多个线程同时工作。
Java 运行环境
Java 运行环境,即Java Runtime Environment,简称为JRE,包含了java虚拟机,java基础类库,是在任何平台上运行Java编写的程序都需要用到的软件环境,是提供给想运行java程序的用户使用的。
JDK是 Java 语言的软件开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
Java Platform Standard Edition 7 Documentation
JRE的成分
- Java的类库,包含了编译Java程序所需要的最核心文件。
- 核心库文件,其中有
- 数据结构的库,包括列表、字典和树等
- XML分析库
- 安全方面应用库
- 国际化和本地化应用库
- 综合库文件,包含了程序员和其他系统通信的功能文件。
- JDBC,即Java数据库联通的API
- JNDI,即Java命名和目录接口
- RMI和CORBA用于重新分发软件
- 用户界面库文件,包含:
- AWT,即抽象窗口开发包,提供了产生图形用户界面所需要的功能
- Swing库
- 其他用于回访媒体文件、录音、截图的库
- 一个用于执行软件的Java虚拟机(JVM)
- 插件,可以在浏览器里面使用
- JWS,可以让终端用户连接到互联网
- 许可文件和文档
JDK各个版本发布时间和版本名称表
版本 | 名称 | 发行日期 |
---|---|---|
JDK 1.0 | Oak(橡树) | 1996-01-23 |
JDK 1.1 | none(无) | 1997-02-19 |
JDK 1.1.4 | Sparkler(宝石) | 1997-09-12 |
JDK 1.1.5 | Pumpkin(南瓜) | 1997-12-13 |
JDK 1.1.6 | Abigail(阿比盖尔–女子名) | 1998-04-24 |
JDK 1.1.7 | Brutus(布鲁图–古罗马政治家和将军) | 1998-09-28 |
JDK 1.1.8 | Chelsea(切尔西–城市名) | 1999-04-08 |
J2SE 1.2 | Playground(运动场) | 1998-12-04 |
J2SE 1.2.1 | none(无) | 1999-03-30 |
J2SE 1.2.1 | none(无) | 1999-03-30 |
J2SE 1.2.2 | Cricket(蟋蟀) | 1999-07-08 |
J2SE 1.3 | Kestrel(美洲红隼) | 2000-05-08 |
J2SE 1.3.1 | Ladybird(瓢虫) | 2001-05-17 |
J2SE 1.4.0 | Merlin(灰背隼) | 2002-02-13 |
J2SE 1.4.1 | grasshopper(蚱蜢) | 2002-09-16 |
J2SE 1.4.2 | Mantis(螳螂) | 2003-06-26 |
Java SE 5.0 (1.5.0) | Tiger(老虎) | 2004-09-30 |
Java SE 6.0 (1.6.0) | Mustang(野马) | 2006-04 |
Java SE 7.0 (1.7.0) | Dolphin(海豚) | 2011-07-28 |
Java SE 8.0 (1.8.0) | Spider(蜘蛛) | 2014-03-18 |
Java SE 9.0 | none(无) | 2017-09-21 |
Java SE 10.0 | none(无) | 2018-03-21 |
Java SE 11.0 | none(无) | 2018-09-25 |
Java SE 12.0 | none(无) | 2019-3-19 |
Java SE 13.0 | none(无) | 2019-9-17 |
Java SE 14.0 | none(无) | 2020-03-17 |
JDK 各版本特性
老版本
JDK 1.0 1996-01-23
JDK 1.1.4 Sparkler 宝石 1997-09-12
JDK 1.1.5 Pumpkin 南瓜 1997-12-13
JDK 1.1.6 Abigail 阿比盖尔–女子名 1998-04-24
JDK 1.1.7 Brutus 布鲁图–古罗马政治家和将军 1998-09-28
JDK 1.1.8 Chelsea 切尔西–城市名 1999-04-08
J2SE 1.2 Playground 运动场 1998-12-04
J2SE 1.2.1 none 无 1999-03-30
J2SE 1.2.2 Cricket 蟋蟀 1999-07-08
J2SE 1.3 Kestrel 美洲红隼 2000-05-08
J2SE 1.3.1 Ladybird 瓢虫 2001-05-17
J2SE 1.4.0 Merlin 灰背隼 2002-02-13
J2SE 1.4.1 grasshopper 蚱蜢 2002-09-16
J2SE 1.4.2 Mantis 螳螂 2003-06-26
JDK 1.0(1996.1.23)
Sun公司发布Java1.0,发布初期叫Oak,后改名为Java;
纯解释运行,使用外挂JIT,性能比较差,运行速度慢
代表技术:JVM,Applet,AWT。
JDK 1.1(1997.2.19)
- JDBC (Java DataBase Connectivity) : 是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。JDBC是面向关系型数据库的。
- RMI (Remote Method Invocation) :Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。
- Java Bean:Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。
- 反射(仅用于内省)
- 支持国际化和Unicode
- 支持内部类
J2SE 1.2(1998.12.8)
Java技术体系拆分为:J2SE、J2EE、J2ME
- JIT (Just In Time):即时编译,又译及时编译、实时编译,动态编译的一种形式,是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态直译。静态编译的程序在执行前全部被翻译为机器码,而直译执行的则是一句一句边运行边翻译。
- EJB技术
- JFC(Java Foundation Classes),包括Swing 1.0、拖放和Java 2D类库
- Java plug-in(Java Applet):Web环境下的小程序
- 集合框架(Collection)
- 对字符串常量做内存映射
- 对打包的Java文件进行数字签名
- 控制授权访问系统资源策略工具
- Java插件
- 在JDBC中引入可滚动结果集、BLOB、CLOB、批量更新和用户自定义类型
- 在Applet中添加声音支持
J2SE 1.3(2000.5.8)
- 初次引入 HotSpot VM
- Java命名和目录接口(Java Naming and Directory Interface,缩写JNDI)包含在主程序库中(先前为扩展组件的形式)
- 用于实现动态代理的类
- 使用CORBA IIOP实现RMI的通信协议
- 改进Java2D
- Java Sound API
- Jar文件索引
- 对Java的各个方面做了大量的优化和增强
J2SE 1.4(2002.2.13)
语言上的改变:assert 关键字(断言)
正则表达式
异常链,允许一个异常来封装原先处于较低级别的异常
支持IPv6 安全套接字(Socket)支持(通过SSL与TLS协议)
非阻塞I/O(NIO)
日志Logging API
XML解析器
XLST转换器
Java打印服务
Java Web Start
Preferences API
JDBC 3.0 API
Image I/O API
J2SE 5.0(2004.9.30)
- 泛型: 为集合提供编译期间 (静态) 类型安全,且不须为大多数类型转换 (类型转换) (规范在 JSR 14)
- 元数据(MetaData): 也称作注解。让语言结构(像是类别和方法)能够用额外的数据标记,可以由元数据意识工具处理(规范在 JSR 175)
- 枚举
- 自动装箱拆箱:基本数据类型如int与Integer之间能够自动转换
- 静态导入(import static)
- 可变参数
- JUC
- 代增强循环 for-each 循环
- Scanner 类别来解析来自各式各样的输入和缓冲
- Instrumentation代理类
JavaSE 6(2006.12.11)
- 引入垃圾回收G1
- 优化锁与同步、垃圾收集、类加载等
- @Override 接口
- 支持动态脚步语言
- JDBC4.0 API
- Java Compiler API
- 可插拔注解
- 增加对Native PKI(Public Key Infrastructure)、Java GSS(Generic Security Service)、Kerberos和LDAP(Lightweight Directory Access Protocol)的支持
- 继承Web服务如HTTP服务器API
JavaSE 7(2011.7.28)
- 钻石型语法(泛型实例化类型自动推断)
- 支持try-with-resources
- 在一个语句块中捕获多种异常,多个catch块用|连接
- switch语句块中允许以字符串作为分支条件
- 支持动态语言
- 64位JDK的指针压缩
- 数值类型可以用2进制字符串表示,并且可以在字符串表示中添加下划线
- Java NIO.2开发包
- null值的自动处理
- 加强对非Java语言的调用支持(JSR-292,升级类加载架构)
JavaSE 8(2014.3.18)
- Lambda表达式(闭包,允许我们将函数当成参数传递给某个方法)
- 接口的默认方法和静态方法
- 方法引用
无参构造器方法引用:类名::new 或者 Class::new
静态方法引用:Class::static_method (接受一个Class类型参数)
类成员方法引用:Class::method (没有参数)
实例成员方法引用:instance::method (接受一个instance对应类型的参数) - 重复注解(同一个地方可以重复使用多次同一个注解,注解本身需要被@Repeatable修饰)
- 升级工具库实现
HashMap实现修改、ConCurrentHashMap实现修改
新增Stream API(java.util.stream)
新增Optional类以解决空指针问题 - 工具包,类依赖分析工具 jdeps
- JVM方面:使用Metaspace(JEP122)代替方法区持久带(PermGen space)
- 函数式接口
- Annotation(注解)
- 并发计数器
- Pipelines Streams API
- Parallel操作
- Optional 类
- TLS SNI
- 移除PermGen Error
- Nashorn, Nashhorn JavaScript 引擎.
JavaSE 9(2017.9.22)
模块系统:模块是一个包的容器,Java 9 最大的变化之一是引入了模块系统(Jigsaw 项目)。
REPL (JShell):交互式编程环境。
HTTP 2 客户端:HTTP/2标准是HTTP协议的最新版本,新的 HTTPClient API 支持 WebSocket 和 HTTP2 流以及服务器推送特性。
改进的 Javadoc:Javadoc 现在支持在 API 文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。
多版本兼容 JAR 包:多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本。
集合工厂方法:List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例。
私有接口方法:在接口中使用private私有方法。我们可以使用 private 访问修饰符在接口中编写私有方法。
进程 API: 改进的 API 来控制和管理操作系统进程。引进 java.lang.ProcessHandle 及其嵌套接口 Info 来让开发者逃离时常因为要获取一个本地进程的 PID 而不得不使用本地代码的窘境。
改进的 Stream API:改进的 Stream API 添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询。
改进 try-with-resources:如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。
改进的弃用注解 @Deprecated:注解 @Deprecated 可以标记 Java API 状态,可以表示被标记的 API 将会被移除,或者已经破坏。
改进钻石操作符(Diamond Operator) :匿名类可以使用钻石操作符(Diamond Operator)。
改进 Optional 类:java.util.Optional 添加了很多新的有用方法,Optional 可以直接转为 stream。
多分辨率图像 API:定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了。
改进的 CompletableFuture API : CompletableFuture 类的异步机制可以在 ProcessHandle.onExit 方法退出时执行操作。
轻量级的 JSON API:内置了一个轻量级的JSON API
响应式流(Reactive Streams) API: Java 9中引入了新的响应式流 API 来支持 Java 9 中的响应式编程。
JavaSE 10 (2018.3.32)
- JEP286,var 局部变量类型推断。
- JEP296,将原来用 Mercurial 管理的众多 JDK 仓库代码,合并到一个仓库中,简化开发和管理过程。
- JEP304,统一的垃圾回收接口。
- JEP307,G1 垃圾回收器的并行完整垃圾回收,实现并行性来改善最坏情况下的延迟。
- JEP310,应用程序类数据 (AppCDS) 共享,通过跨进程共享通用类元数据来减少内存占用空间,和减少启动时间。
- JEP312,ThreadLocal 握手交互。在不进入到全局 JVM 安全点 (Safepoint) 的情况下,对线程执行回调。优化可以只停止单个线程,而不是停全部线程或一个都不停。
- JEP313,移除 JDK 中附带的 javah 工具。可以使用 javac -h 代替。
- JEP314,使用附加的 Unicode 语言标记扩展。
- JEP317,能将堆内存占用分配给用户指定的备用内存设备。
- JEP317,使用 Graal 基于 Java 的编译器,可以预先把 Java 代码编译成本地代码来提升效能。
- JEP318,在 OpenJDK 中提供一组默认的根证书颁发机构证书。开源目前 Oracle 提供的的 Java SE 的根证书,这样 OpenJDK 对开发人员使用起来更方便。
- JEP322,基于时间定义的发布版本,即上述提到的发布周期。版本号为$FEATURE.$INTERIM.$UPDATE.$PATCH,分别是大版本,中间版本,升级包和补丁版本。
JavaSE 11 (2018.9.25)
- JEP 181:Nest-Based访问控制
- JEP 309:动态类文件常量
- JEP 315:改善Aarch64 intrinsic
- JEP 318:Epsilon:无操作垃圾收集器
- JEP 320:消除Java EE和CORBA模块
- JEP 321:HTTP客户端(标准)
- JEP 323:lambda参数的局部变量语法
- JEP 324:Curve25519和Curve448关键协议
- JEP 327:Unicode 10
- JEP 329:ChaCha20和Poly1305加密算法
- JEP 330:发射一列纵队源代码程序
- JEP 331:低开销堆分析
- JEP 321:HTTP Client
- JEP 332:传输层安全性(Transport Layer Security,TLS)1.3
- JEP 328:添加Java飞行记录器(JFR),其用于创建性能分析记录
- JEP 333:添加ZGC(一个可扩展的低延迟垃圾收集器)
- JavaFX、Java EE、CORBA 被移出 JDK
- JEP 335:弃用 Nashorn JavaScript 引擎
JavaSE 12(2019.3.19)
- JEP 189:Shenandoah: A Low-Pause-Time Garbage Collector (Experimental) :新增一个名为 Shenandoah 的垃圾回收器,它通过在 Java 线程运行的同时进行疏散 (evacuation) 工作来减少停顿时间。
- JEP 230:Microbenchmark Suite:新增一套微基准测试,使开发者能够基于现有的 Java Microbenchmark Harness(JMH)轻松测试 JDK 的性能,并创建新的基准测试
- JEP 325:Switch Expressions (Preview) :对 switch 语句进行扩展,使其可以用作语句或表达式,简化日常代码。
- JEP 334:JVM Constants API :引入一个 API 来对关键类文件 (key class-file) 和运行时工件的名义描述(nominal descriptions)进行建模,特别是那些可从常量池加载的常量。
- JEP 340:One AArch64 Port, Not Two :删除与 arm64 端口相关的所有源码,保留 32 位 ARM 移植和 64 位 aarch64 移植。
- JEP 341:Default CDS Archives :默认生成类数据共享(CDS)存档。
- JEP 344:Abortable Mixed Collections for G1 :当 G1 垃圾回收器的回收超过暂停目标,则能中止垃圾回收过程。
- JEP 346: Promptly Return Unused Committed Memory from G1 :改进 G1 垃圾回收器,以便在空闲时自动将 Java 堆内存返回给操作系统。
JavaSE 13(2019.9.17)
- 350: 动态CDS档案。 提高应用程序类 - 数据共享(AppCDS)的可用性。消除了用户进行试运行以创建每个应用程
序的类列表的需要。-Xshare:dump使用类列表由该选项启用的静态归档应继续工作。这包括内置类
加载器和用户定义的类加载器的类。 - 351: ZGC:取消提交未使用的内存。 增强ZGC以将未使用的堆内存返回给操作系统。
- 353: 重新实现旧版套接字API
- 354: switch优化更新(预览版)
- 355: 文本块升级,文字块(预览)
JavaSE 14(2020.3.17)
- 305:instanceof的模式匹配(预览)
- 343:包装工具(培养箱)
- 345:G1的NUMA感知内存分配
- 349:JFR事件流
- 352:非易失性映射字节缓冲区
- 358:有用的NullPointerExceptions
- 359:记录(预览)
- 361:开关表达式(标准)
- 362:弃用Solaris和SPARC端口
- 363:删除并发标记扫描(CMS)垃圾收集器
- 364:Mac OS上的ZGC
- 365:Windows上的ZGC
- 366:弃用ParallelScavenge + SerialOld GC组合
- 367:删除Pack200工具和API
- 368:文本块(第二预览)
- 370:外部存储器访问API(孵化器)
Oracle Java SE支持路线图
Oracle Java SE支持路线图*† | ||||
---|---|---|---|---|
发布 | GA日期 | 首要支持,直到 | 扩展支持,直到 | 持续支持 |
7 | 2011年7月 | 2019年七月 | 2022年7月***** | 不定 |
8 ** | 2014年3月 | 2022年3月 | 2030年12月 | 不定 |
9(非LTS) | 2017年9月 | 2018年三月 | 无法使用 | 不定 |
10(非LTS) | 2018年三月 | 2018年9月 | 无法使用 | 不定 |
11(LTS) | 2018年9月 | 2023年9月 | 2026年9月 | 不定 |
12(非LTS) | 2019年三月 | 2019年九月 | 无法使用 | 不定 |
13(非LTS) | 2019年九月 | 2020年3月 | 无法使用 | 不定 |
14(非LTS) | 2020年3月*** | 2020年9月 | 无法使用 | 不定 |
15(非LTS) | 2020年9月*** | 2021年3月 | 无法使用 | 不定 |
Java类库提升
Java5 | Java6 | Java7 | Java8 | Java9 | Java10 |
---|---|---|---|---|---|
发框架(J.U.C) | JDBC 4.0 | NIO 2 | Stream API | Reactive Streams Flow API | Java-Based JIT Compiler |
格式化(Fomatter) | JAXB 2.0 | Fork/Join框架 | CompletableFuture | Process API Updates | |
Java管理扩展(JMX) | 可插拔注解处理AP | Iinvokedynamic字节码 | Annotation on Java Types | Variable Handles | |
Instrumentation | Common Annotations | Date and Time API | Method Handles | ||
XML处理(DOM、SAX、XPath、XSTL) | Java Compiler Api | 可复制Annotations | Spin-Wait Hints | ||
Scripting in JVM | JavaScript运行时 | Stack-Walking API |
Reference
本作品采用《CC 协议》,转载必须注明作者和本文链接