zenith-docs 1.0.0 Help

Java

这篇文档描述了 Java 的一些背景信息,比如名字的由来。

Java 名字的由来

Java 这个名字本意是印度尼西亚爪洼岛的英文,因为盛产咖啡闻名,Java 之父 James Gosling 一开始取了两个名字 Lyric 和 Oak, Oak 是他办公室外一 颗茂密的橡树。但是这两个名字都已经被注册了,所以大家又想了很多名字,并且投票投出了 Silk,中文名为丝绸。但是 James Gosling 反对。然后排在第二 和第三的这两个名字,律师反对。于是就选择了排在第四的名字,叫做 Java。

另外,一个 Java 的 Class 编译后的字节码文件如果用 16 进制来查看的话,开头是CAFE BABA, 所以 Java 和咖啡有着非常紧密的联系:

bytes code

字节码名字的由来

因为 JVM 中一个指令中第一个字节代表操作码(opcode),所以被称之为字节码。一些常见的字节码,如下表所示:

指令类别

示例指令

描述

常量加载

iconst_m1, iconst_0, ldc (加载常量池中的常量)

将整型或引用常量压入操作数栈

数组和集合操作

newarray (创建新的基本类型数组), aastore (将引用类型值存入数组)

创建、读取或修改数组元素

控制流

goto, ifeq (如果等于零则跳转), jsr (跳转并保存返回地址)

改变程序执行顺序

方法调用与返回

invokevirtual, invokestatic, invokespecial, invokevirtualinterface

调用类的方法或接口方法以及处理返回

类型转换

i2l (int转long), checkcast (检查对象是否为指定类或其子类实例)

在运行时进行数据类型的转换

局部变量操作

iload_n, istore_n (加载/存储int型局部变量)

从局部变量表中读取或写入数据

数学运算

iadd, isub, imul, idiv (整数加减乘除)

对整数执行数学运算

对象操作

anewarray (创建新的引用类型数组), getfield, putfield

创建新对象、访问或修改对象字段

OpenJDK 和 OracleJDK

简单来说,OpenJDK 和 OracleJDK 它们之间的差异非常小。一般情况下,我们选择 OpenJDK 就可以了,有着更宽容的许可。

特性

OpenJDK

Oracle JDK

许可证

GNU General Public License, version 2 (GPLv2) with Classpath Exception

Oracle Technology Network License Agreement(对于商业用途可能需要付费)

支持

社区支持,部分第三方提供商提供商业支持

Oracle提供的专业商业支持

性能和特性

作为Java平台的参考实现,与Oracle JDK非常接近

过去包含一些独有特性和性能优化,但现在两者差异较小

更新和维护

定期更新,但商业支持可能不如Oracle JDK

对于商业用户,提供优先级较高的更新和安全补丁

适用场景

适用于需要开源解决方案的开发者和企业,以及大多数通用应用

适合需要额外商业支持和服务的企业用户

让人困惑的版本号

针对不同的目标平台,Java 有如下版本:

Java版本

目标平台

主要用途

Java SE (Standard Edition)

个人电脑、服务器

Java SE提供了进行Java应用程序开发所需的核心功能,包括所有的基本APIs和Java虚拟机(JVM)。它是开发桌面应用程序、控制台程序和基本服务器应用程序的基础。

Java EE (Enterprise Edition)

企业级服务器

Java EE在Java SE的基础上增加了构建大型、多层、可扩展、安全且高性能的企业级应用程序的功能。它包括一系列扩展APIs和运行时环境,用于开发面向企业的应用程序,比如Web服务、分布式计算和云应用。

Java ME (Micro Edition)

嵌入式和移动设备

Java ME是为嵌入式和移动设备提供的轻量级平台,支持有限资源的设备,比如手机、掌上游戏机和小型嵌入式设备。它包括一套特定的APIs,用于开发适合这些类型设备的应用程序。

随着技术的发展,Java ME 的重要性已经大大降低,因为智能手机和平板电脑等设备已经足够强大,能够运行标准的Java SE应用程序。同时,Java EE已经被 Jakarta EE所取代,这是由 Eclipse Foundation 管理的开源项目,继续 Java EE 的工作和进步。Jakarta EE 旨在发展云原生Java企业级应用的新技术 和标准。

Java SE 传统的版本表示法是 1.x。比如 Java 8 也可以表示为 Java 1.8。但是从 Java 9 开始就不再如此表示了。

Java版本

发布日期

字节码版本

主要特性

Java SE 8

2014年3月

52

Lambda表达式、Stream API、新的日期时间API、接口的默认和静态方法

Java SE 9

2017年9月

53

模块系统(Jigsaw项目)、JShell、私有接口方法

Java SE 10

2018年3月

54

局部变量类型推断(var关键字)、应用类数据共享(CDS)

Java SE 11

2018年9月

55

新的HTTP客户端API(标准化)、局部变量语法扩展(lambda表达式)、ZGC

Java SE 12

2019年3月

56

Shenandoah GC、Switch表达式(预览)、JVM常量API

Java SE 13

2019年9月

57

Switch表达式(标准)、文本块(预览)、ZGC和Shenandoah GC的改进

Java SE 14

2020年3月

58

Switch表达式(标准化)、记录(Record)(预览)、Pattern Matching for instanceof(预览)

Java SE 15

2020年9月

59

文本块(标准)、Sealed类(预览)、ZGC和Shenandoah GC的改进、隐藏类

Java SE 16

2021年3月

60

记录(Record)(标准)、Pattern Matching for instanceof(标准)、ZGC的改进

Java SE 17

2021年9月

61

封密类(Sealed Classes)(标准)、Pattern Matching for switch(预览)、新的垃圾回收器JEPs

Java SE 18

2022年3月

62

项目Loom的结构化并发(预览)、Project Panama的向量API(孵化器)

Java SE 19

2022年9月

63

结构化并发(孵化器)、记录模式(预览)、外部函数和内存API(预览)、虚拟线程(预览)、Switch 表达式(预览)

Java SE 20

2023年3月

64

作用域值(孵化器)、向量API(孵化器)、结构化并发(孵化器)

Java SE 21

2022年9月

65

虚拟线程、有序集合、外部函数和内存API(预览)、作用域值(预览)、Vector API(孵化器)、Record 模式、分代 ZGC

Last modified: 04 August 2024