一. Java 知识脉络图
Java 基础全程脉络图
本章专题与脉络

二. 抽丝剥茧话 Java
当前大学生就业形势
麦可思研究院 发布了《2022年中国大学生就业报告》,针对2021届毕业生收入较高的本科专业排行榜:

麦可思研究院 发布过《2021年中国大学生就业报告》,应届本科毕业生就业数量较大的前十位行业类的就业质量:

报告还对毕业三年后的2017届毕业生所在十大行业进行了统计:

从国家统计局发布的2021年全国平均工资来看,不管在城镇非私营单位还是私营单位,IT业均为最高
IT互联网是否依旧靠谱
过去不能代表未来!互联网是否依旧靠谱?

2014 年至 2018 年间,我国网民规模从 6.49 亿增长为 8.29 亿,增幅为 27.5%。同一时间段,全国移动互联网接入的流量却从 20.6EB 增长到了 711.1EB,增幅达 3352%(获取和处理的信息量大幅增加)。
随着 5G 技术进一步拓宽移动互联网的速度和容量,产业互联网将在消费型流量的基础上创造生产型流量,根据报告的预测,至 2024 年,全国移动互联网的接入流量将达到 127663.8EB, 流量规模达到2018年的179.5倍。
当下,5G、物联网、人工智能、产业互联网都是国家政策大方向,需要大量能与机器对话的中高端人才。
IT行业岗位分析

软件开发,是进入互联网IT圈最好的选择之一!
起始薪资高、工作环境好、涨薪幅度高、行业更公平
软件开发之 Java 开发


1. 移动应用领域(集成 Android 平台):Java 在 Android 端是主要开发的语言,占有重要的地位。


2. 企业级应用领域(JavaEE 后台):用来开发企业级的应用程序,大型网站如淘宝、京东、12306,以及各大物流、银行、金融、社交、医疗、交通、各种 OA 系统等都是用 JavaEE 技术开发的。

3. 大数据分析、人工智能领域:流行的大数据框架,如 Hadoop、Flink 都是用 Java 编写的。Spark 使用 Scala 编写,但可以用 Java 开发应用。


Eversoft 公司在提到 2022 年 Java 发展趋势时写道:
Java 是用于开发大数据项目的最主流的语言。我们可以轻松地预测它也将在之后继续主导大数据!
4. 游戏领域、桌面应用、嵌入式领域:很多大型游戏的后台、桌面应用等也是 Java 开发的。
到底多少人在用 Java
2020年,根据 IDC 的报告“Java Turns 25”显示,超过 900万 名开发人员(全球专职开发人员中的 69%)在使用 Java — 比其他任何语言都多。该报告指出,大多数企业业务服务都依靠 Java 来实现。
Java 一直是开发人员中最流行的编程语言,被誉为“宇宙第一语言
”
我想告诉大家:
“市场的需求比较大,市场的供给比较大”。
“如果你在 Java 领域里持续积累5-7年以上,那么你至少会成为这个行业的一个专家!”
八卦一下程序员

还可以是:

Java 系列课程体系

Java 职业晋升路线图
薪资数据统计来源:拉勾网

三. 计算机的硬件与软件
计算机组成:硬件 + 软件

CPU、内存、硬盘

CPU(Central Processing Unit,中央处理器)
人靠大脑思考,电脑靠 CPU 来运算、控制。
硬盘(Hard Disk Drive)
计算机最主要的存储设备,容量大,断电数据不丢失;
正常分类:机械硬盘HDD、固态硬盘SSD 以及 混合硬盘SSHD;
固态硬盘在开机速度和程序加载速度远远高于机械硬盘,缺点贵,所有无法完全取代机械硬盘。内存(Memory)
负责硬盘上的数据与 CPU 之间数据交换处理,断电后数据丢失。
保存从硬盘读取的数据,提供给 CPU 使用;
保存 CPU 的一些临时执行结果,以便 CPU 下次使用或保存到硬盘;
输入设备:键盘输入
熟悉指法
不熟悉键盘的小伙伴,可以“金山打字通”走起了。坚决杜绝二指禅!
四. 软件相关介绍
什么是软件?
软件,即一系列按照特定顺序组织的计算机数据和指令的集合,分为系统软件和应用软件。
Pascal之父 Nicklaus Wirth: “Programs = Data Structures + Algorithms”
系统软件:
应用软件:
人机交互方式
- 图形化界面(Graphical User Interface,
GUI
):这种方式简单直观,使用者易于接受,容易上手操作。 - 命令行方式(Command Line Interface,
CLI
):需要在控制台输入特定的指令,让计算机完成一些操作。需要记忆一些指令,较为麻烦。
DOS 命令(适用于 Windows)
DOS 是单用户、单任务(即只能执行一个任务)的操作系统。
DOS:全称为
Disk Operating System(磁盘操作系统)
,是 Microsoft 公司在 Windows 系统推出之前开发的早期操作系统。 虽然现在 DOS 已被 Windows 所取代,但 Windows 系统中仍然内置了兼容 DOS 风格的命令提示符(Command Prompt)
工具,简称 cmd。
对于 Java 初学者来说,掌握一些基础的 DOS 命令,能帮助我们在不依赖图形界面的情况下完成文件管理、项目创建和程序运行等操作。
✅ 打开方式:键盘按下 Windows + R,输入 cmd 并回车,进入到 DOS 命令行窗口

Terminal 命令(适用于 MacOS)
macOS 是基于 UNIX 构建的现代操作系统,自带一个强大的命令行工具,叫做 Terminal(终端)。
Terminal:中文称为“终端”,是 macOS 中的命令行窗口,允许用户通过输入指令直接控制电脑、管理文件和运行程序。
对于 Java 初学者,同样有必要掌握一些常用 Terminal 命令,来操作文件系统和执行编译任务。
✅ 打开方式:使用快捷键 Command + 空格 打开 Spotlight,输入 terminal 并回车,即可打开终端窗口
🧠 Terminal 中的 bash 与 zsh 是什么?
在 macOS 中,Terminal(终端)只是一个“壳子”,真正负责解释我们输入命令、执行脚本的,其实是“Shell(壳)程序”。
而 bash 和 zsh,就是两种常见的 Shell 类型:
名称 | 全称 | 说明 |
---|---|---|
bash | Bourne Again SHell | Linux 与早期 macOS 默认 Shell,简单、稳定 |
zsh | Z Shell | 功能更强大,支持自动补全、语法高亮、更好的配置扩展 |
🕰️ 历史渊源与变化
早期版本的 macOS(10.15 Catalina 之前)默认使用的是 bash。
从 macOS 10.15 Catalina 起(2019 年),Apple 将默认的 Shell 改成了 zsh。
原因之一是 bash 的新版使用了 GPLv3 协议,而 Apple 不愿将其引入系统中。
不过你仍然可以随时切换使用 bash 或 zsh,它们都是兼容 POSIX 的 Shell,有很多命令是通用的。
🔄 如何查看/切换当前 Shell?
- 查看当前使用的 Shell:
echo $SHELL
输出如 /bin/zsh 表示你正在使用 zsh。
- 临时切换(当前窗口有效):
bash # 切换到 bash
zsh # 切换回 zsh
- 永久更改默认 Shell:
chsh -s /bin/zsh # 设置默认使用 zsh
chsh -s /bin/bash # 设置默认使用 bash
CMD 与 Terminal 命令对照表
⚠️ 注意
关于文件系统对大小写的敏感性问题,不同操作系统默认行为如下:
操作系统 | 默认是否区分大小写 | 是否可改为区分大小写 | 说明 |
---|---|---|---|
Windows | ❌ 不区分 | ⚠️技术支持但不推荐 | 在 NTFS 文件系统中,虽然技术上支持大小写区分,但 Windows 默认行为是不区分的(即 file.txt 和 File.txt 视为同一个文件)。 |
macOS | ❌ 不区分 | ✅ 可格式化为区分 | 默认使用 APFS (不区分大小写) 或 HFS+ (大小写不敏感),但可格式化为区分大小写的版本,如 APFS (区分大小写) 。大多数用户使用的是不区分大小写的版本,开发者可手动创建区分大小写的卷或磁盘镜像。 |
Linux | ✅ 区分 | ✅ 可选 | 常见文件系统(如 ext4、xfs 等)默认严格区分大小写,file.txt 与 File.txt 被认为是两个不同文件。 |
开发建议始终按照大小写敏感方式书写文件名和引用路径(即便在 macOS/Windows 测试通过)。
目录操作
操作 | Windows CMD | macOS Terminal | 说明 |
---|---|---|---|
查看当前路径 | cd | pwd | CMD 中 cd 显示当前目录;macOS 用 pwd (print working directory) |
查看目录内容 | dir | ls | 列出当前目录下的文件和文件夹 |
进入目录 | cd 目录名 | cd 目录名 | 支持相对路径或绝对路径 |
进入多级目录 | cd dir1\dir2 | cd dir1/dir2 | |
返回上一级 | cd .. | cd .. | 返回上一层目录 |
返回根目录 | cd \ | cd / | Windows 回到盘符根目录;mac 回到文件系统根目录 |
切换盘符 | <盘符名称>: (如D: 表示切换到D盘) | ⛔ 不适用(Mac 无盘符) | Windows 可切换多盘符;macOS 默认只有一个文件系统结构 |
创建 / 删除目录与文件
操作 | Windows CMD | macOS Terminal | 说明 |
---|---|---|---|
创建目录 | md 目录名 或 mkdir | mkdir 目录名 | 创建一个新目录 |
删除空目录 | rd 目录名 | rmdir 目录名 或 rm -d 目录名 | 仅能删除空目录 |
强制删除非空目录 | rd /s /q 目录名 | rm -rf 目录名 | 危险操作,强制递归删除所有内容 |
创建空文件 | echo. > 文件名 | touch 文件名 | CMD 中可用 echo. 重定向生成空文件 |
删除单个文件 | del 文件名 | rm 文件名 | 删除指定文件 |
删除多个文件 | del *.txt | rm *.txt | 使用通配符删除多个符合条件的文件 |
查看 / 编辑文件内容
⚠️ 注意
在终端执行编辑相关命令时,如果省略文件后缀,系统会创建一个新的无后缀同名文件,而不会修改已有的文件!为避免重复或误操作,请始终写出完整文件名(含后缀)。
写完整文件后缀,可被大多数系统/编辑器自动识别,更容易被其他人或工具识别用途。
操作 | Windows CMD | macOS Terminal | 说明 |
---|---|---|---|
查看文件内容 | type 文件名 | cat 文件名 | 适用于小文件;内容较多时推荐分页查看 |
分页查看文件 | more 文件名 | more 文件名 或 less 文件名 | macOS 推荐使用 less ,支持上下滚动 |
查看前几行内容 | — | head -n 10 文件名 | 查看文件前 10 行 |
查看后几行内容 | — | tail -n 10 文件名 | 查看文件后 10 行 |
编辑文件内容(终端内) | copy con 文件名 | nano 文件名 或 vim 文件名 | 文件若不存在,则会创建。nano 更适合新手;vim 功能强大但学习成本较高 |
编辑文件内容(图形) | notepad 文件名 或 start 文件名 | open 文件名 |
其他常用命
操作 | Windows CMD | macOS Terminal | 说明 |
---|---|---|---|
清屏 | cls | clear | 清空当前终端显示内容 |
退出终端 | exit | exit | 关闭命令行窗口 |
历史命令 | ↑ / ↓ | ↑ / ↓ 或 history | 调阅历史命令 |
删除字符 | Backspace / Delete | Backspace / Delete | 删除输入中的字符 |
自动补全路径 | Tab (部分版本支持) | Tab | 自动补齐文件夹/文件名 |
删除光标前整行(清空) | Esc | Ctrl + U | CMD 无法一键删除光标前文本,只能手动或清空整行 |
删除光标前一个单词 | 无 | Ctrl + W | CMD 不支持「按单词」删除 |
清空整行 | Esc 多次 | Ctrl + U (Zsh 下) | 只能通过 Backspace 或重新输入来「模拟清空」 |
光标移动到行首 | Home | Ctrl + A | CMD 中使用 Home 键将光标移至行首 |
光标移动到行尾 | End | Ctrl + E | CMD 中使用 End 键将光标移至行尾 |
五. 计算机编程语言
什么是计算机语言?
语言:是人与人之间用于沟通的一种方式。
例如:中国人与中国人用普通话沟通,而中国人要和英国人交流,可以使用英语或普通话。
计算机编程语言:就是人与计算机交流的方式。
人们可以使用
编程语言
对计算机下达命令
,让计算机按照命令完成人们需要的功能。
语言 = 语法 + 逻辑,计算机语言有很多种:
例如:C、C++、Java、Go、JavaScript、Python,Scala 等。
计算机语言简史
第一代:机器语言(相当于人类的石器时代)
1946年2月14日,世界上第一台计算机 ENAC 诞生,使用的是最原始的
穿孔卡片
,这种卡片上使用的是用二进制代码
表示的语言,与人类语言差别极大,这种语言就称为机器语言。
比如一段典型的机器码:
1. 0000,0000,000000010000 代表 LOAD A, 16
2. 0000,0001,000000000001 代表 LOAD B, 1
3. 0001,0001,000000010000 代表 STORE B, 16
机器语言本质上是计算机能识别的唯一语言
,人类很难理解。可以大胆想象"此时的程序员99.9%都是异类!"
第二代:汇编语言(相当于人类的青铜&铁器时代)
使用
英文缩写的助记符
来表示基本的操作,这些助记符构成了汇编语言的基础。比如:LOAD、MOVE 等,使人更容易使用,因此汇编语言也称为符号语言
。
优点:能编写相对较高效率的程序。
缺点:汇编语言是面向机器的,不同计算机机型特点不同,因此会有不同的汇编语言,彼此之间 不能通用
,程序不易移植,较难调试。

比起机器语言,汇编大大进步了,是机器语言向更高级的语言进化的桥梁,目前仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。
第三代:高级语言(相当于人类的信息时代)
高级语言发展于20世纪50年代中叶到70年代,是一种接近于人们使用习惯的程序设计语言, 它允许程序员使用
接近日常英语的指令
来编写程序,程序中的符号和算式也与日常用的数学式子差不多,接近于自然语言和数学语言,容易为人们掌握。比如:

高级语言独立于机器,有一定的通用性。
计算机不能直接识别和执行用高级语言编写的程序,需要使用编译器或解释器,转换为机器语言才能被识别和执行
。


此外,高级语言按照程序设计方法的不同,又分为:面向过程的语言、面向对象的语言
- C、Pascal、Fortran 面向过程的语言
- C++ 面向过程/面向对象
- Java 跨平台的纯面向对象的语言
- C#、Python、JavaScript、Scala…
目前以及可预见的将来,计算机语言仍然处于“第三代高级语言”阶段。但是不管是什么语言,最后都要向机器语言靠近,因为 CPU 只认识 0 和 1。
计算机语言排行榜
TIOBE是一个流行编程语言排行,每月更新。排名权重基于世界范围内工程师数量,Google、Bing、Yahoo! 、Wikipedia、Amazon、Youtube 和百度这些主流的搜索引擎,也将作为排名权重的参考指标。

计算机语言走势

编程语言,该学哪个?

网传的编程语言鄙视链:

C:万物之源
诞生于
1972
年,由AT&T公司旗下贝尔实验室创建完成,用于构建 Unix 操作系统。
偏向计算机底层操作(操作系统、网络、硬件驱动等)。
优势:几乎所有现代编程语言都脱胎于 C。
劣势:相当陡的学习曲线;不支持面向对象编程。
C++:最复杂最难的语言
诞生于1983年,作为 C 语言的增强方案、升级版本。C++ 是 C 语言的超集,C 语言的大部分知识也适用于 C++。
用途:Windows 或 MacOS UI、office 全家桶、主流的浏览器、Oracle、MySQL、著名的游戏引擎(如星际争霸、魔兽世界)等。
优势:很多公司都用 C++ 开发核心架构,如 Google、腾讯、百度、阿里云等;面向对象性。
劣势:体系极为庞大,这是世界目前来说最复杂也是最难的编程语言。
C#:背靠大树(微软)的语言
诞生于2000年,一款强大而灵活的编程语言。靠着微软这棵大树,是多年来 Windows 平台的一门主流编程语言。
用途:Windows 桌面应用开发、Windows Azure、游戏开发。
PHP:最好的语言?
诞生于1994年,一款服务器端脚本语言。最初表示个人主页(Personal Home Page)。
PHP 语法和 C 类似,有很多的模板和框架,简单易懂,也许你可以在短短几天做出 web app。它主要用于 web 端,快速建站网络开发。
劣势:学习门槛太低、其代码运行速度相对较低于大部分编程语言竞争对手。
Python:易学的语言
诞生于1991年,一种面向对象的语言,虽然运行效率不高,但是开发效率非常高。
被称为胶水语言,哪里都可以用。
JavaScript:前端为王
诞生于
1995
年,网景公司开发完成。
是目前所有主流浏览器上唯一支持的脚本语言。在前端开发中,占有不可替代的地位。
Java:需求最多也最不缺人
创建于
1995
年,是一种面向对象、基于类的编程语言。
可能是目前运用最广的项目语言。代码稳定性超过 C 和 C++,生产力远超 C 和 C++。有 JVM 在,可以轻松地跨平台。
具有强大的开源开发工具,大量的开源共享库。
拥有世界上数量最多的程序员,最不缺人。
Go:夹缝中生存
现在很受关注,它是取代 C 和 C++ 的另一门有潜力的语言。
C 语言太原始了,C++ 太复杂了,Java 太高级了,所以 Go 语言就在这个夹缝中出现了。
已成为云计算领域事实上的标准语言,尤其是在 Docker/Kubernetes 等项目中。
语法特别简单,你有了 C 和 C++ 的基础,学习 Go 的学习成本基本为零。
Go 社区从 Java 社区移植了各种优秀的框架或库。
总结:
程序设计语言有很多种,每种语言都是为了实现某个特定的目的而发明的。
没有“最好”的语言,只有在特定场景下相对来说,最适合的语言而已。
如果你掌握了一种编程语言,也会更容易上手其它的编程语言。关键是学习如何使用程序设计方法来解决问题。
Talk is cheap,Show me the code。
六. Java 语言概述
Java 概述
Java 是 SUN
(Stanford University Network,斯坦福大学网络公司 ) 1995
年推出的一门高级编程语言。
是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏览器中运行,这些 Java 程序被称为 Java 小程序(applet),内嵌在 HTML 代码中。
伴随着互联网的迅猛发展,以及 Java 技术在 Web 方面的不断成熟,已经成为 Web 应用程序的首选开发语言。
Java 语言简史
起步阶段:
1991年,Sun公司的工程师小组想要设计一种语言,应用在电视机、电话、闹钟、烤面包机等
家用电器的控制和通信
。由于这些设备的处理能力和内存都很有限,并且不同的厂商会选择不同的中央处理器(CPU), 因此这种语言的关键是代码短小、紧凑且与平台无关
(即不能与任何特定的体系结构捆绑在一起)。
Gosling团队率先创造了这个语言,并命名为“
Oak
"(起名的原因是因为他非常喜欢自己办公室外的橡树
)。后因智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。
随着20世纪90年代互联网的发展,Sun公司发现该语言在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布(Java是印度尼西亚
爪哇岛
的英文名称,因盛产咖啡而闻名)。

发展阶段:
发行版本 | 发行时间 | 备注 |
---|---|---|
Java 1.0 | 1996.01.23 | Sun公司发布了Java的第一个开发工具包 |
Java 1.1 | 1997.02.19 | JavaOne会议召开,创当时全球同类会议规模之最。 |
Java 1.2 | 1998.12.08 | Java拆分成:J2SE(标准版)、J2EE(企业版)、J2ME(小型版) |
Java 1.3 | 2000.05.08 | |
Java1.4 | 2004.02.06 | |
Java 5.0 | 2004.09.30 | ① 版本号从1.4直接更新至5.0;② 平台更名为JavaSE、JavaEE、JavaME |
Java 6.0 | 2006.12.11 | 2009.04.20 Oracle宣布收购SUN公司 |
2009.04.20 | Oracle公司收购SUN,交易价格74亿美元 | |
Java 7.0 | 2011.07.02 | |
Java 8.0 | 2014.03.18 | 此版本是继Java 5.0以来变化最大的版本。是长期支持版本(LTS) |
Java 9.0 | 2017.09.22 | ① 此版本开始,每半年更新一次;② Java 9.0开始不再支持windows 32位系统 |
Java 10.0 | 2018.03.21 | |
Java 11.0 | 2018.09.25 | JDK 安装包取消独立 JRE 安装包,是长期支持版本(LTS) |
Java 12.0 | 2019.03.19 | |
... | ... | |
Java17.0 | 2021.09 | 发布Java 17.0,版本号也称为21.9,是长期支持版本 |
... | ... | |
Java19.0 | 2022.09 | 发布Java19.0,版本号也称为22.9 |
... | ... | ... |
Java 之父

詹姆斯·高斯林 先生以“Java 技术之父”而闻名于世。他是 Java 技术的创始人,他亲手设计了 Java 语言,并开发了 Java 编译器和 Java 虚拟机,使 Java 成为了世界上最流行的开发语言。
James Gosling 于 1984 年加入 Sun 公司,并一直服务于 Sun 公司,直至 2010 年前后,Sun 被 Oracle 并购而加入 Oracle,担任客户端软件集团的首席技术官,2010 年 4 月从 Oracle 离职。
公司八卦
SUN 与 Oracle
SUN 是一家极具创新能力的公司,2001年 “9.11”以前,SUN公司市值超过1000亿美元。 但是没能利用Java构建一个强有力、可变现的生态系统,没打好Java这张牌。此后,互联网泡沫破裂,硬件需求大幅减少,它的市值在一个月之内跌幅超过90%。SUN公司的成长用了20年,而衰落只用了1年!

Google 和 Oracle 的侵权事件:
2010 年 8 月,Oracle 起诉 Google 的 Android 系统侵权,要求赔偿 26 亿美元,Oracle 认为 Google 的代码中使用了 Java 的 37 个API, 并且认为 Google 是故意为之,因为这样做的好处是可以让更多的 Java 程序员更容易接受 Android 的代码。
Oracle 认为 Android 中有 9 行代码直接抄袭了Java的实现。这 9 行牛气哄哄的代码都出自一人之手,他就是Java 大牛 —— Joshua Bloch。
//Code In OpenJDK / Android :
private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +") > toIndex(" + toIndex+")");
if (fromIndex < 0)
throw new ArrayIndexOutOfBoundsException(fromIndex);
if (toIndex > arrayLen)
throw new ArrayIndexOutOfBoundsException(toIndex);
}
2018 年 3 月,美国联邦巡回上诉法院裁决,谷歌侵犯了甲骨文的版权,支付高达88亿美元的赔偿金。
2021 年 4 月,美国最高法院给出了最终裁决:谷歌胜诉,其代码属于“合理使用”的范畴。为期十多年的软件行业“第一版权案”落幕。

Java 技术体系平台
JavaSE(Java Standard Edition)标准版,以前称为 J2SE
支持面向桌面级应用开发(如 Windows 下的应用程序)的 Java 平台,即定位个人计算机的应用开发。
包括用户界面接口 AWT 及 Swing,网络功能与国际化、图像处理能力以及输入输出支持等。
JavaEE(Java Enterprise Edition)企业版,以前称为 J2EE
为开发企业环境下的应用程序提供的一套解决方案,即定位在服务器端的 Web 应用开发。
JavaEE 是 JavaSE 的扩展,增加了用于服务器开发的类库。如:Servlet 能够延伸服务器的功能,通过请求-响应的模式来处理客户端的请求;JSP 是一种可以将 Java 程序代码内嵌在网页内的技术。
JavaME(Java Micro Edition)小型版,以前称为 J2ME
支持 Java 程序运行在移动终端上的平台,即定位在消费性电子产品的应用开发(手机、机顶盒)。
JavaME 是 JavaSE 的内伸,精简了 JavaSE 的核心类库,同时也提供自己的扩展类。
增加了适合微小装置的类库:javax.microedition.io.* 等。

⚠️ 注意
Android 开发 !== JavaME 开发。
七. Java 开发环境搭建
什么是 JDK、JRE
JDK(Java Development Kit):Java 程序开发工具包
,包含 JRE、开发人员使用的工具。
JRE(Java Runtime Environment):Java 程序的运行时环境
,包含 JVM、运行时所需要的核心类库。

如下是 Java 8.0 Platform:

小结:
JDK = JRE + 开发工具集(例如 Javac 编译工具等)。
JRE = JVM + Java SE 标准类库。
JDK 版本选择


自 Java8 版本发布以来,其后的每次更新,都会有小伙伴高呼:Java8 YYDS!
论坛的声音:“
你发任你发,我用 Java8!
”
数据说话 - 1:
JRebel 于2022年4月前后发布了《2022 年Java生态系统状况报告》,报告中提到使用 Java11 的占比最多,Java8 紧随其后,如下图。而此前2020年的报告显示,Java8占比达到了84.48%。

我的分析:
G1 是最受欢迎的 GC 算法, Java11 及更高版本的 G1 收集器是默认的 GC,而 Java8 中并不是,出于对 G1 的喜爱,很多开发者才会选择抛弃 Java8。
数据说话 - 2:
此外,某美国软件开发商在对近千名专业的 Java 开发者调研后,发布的《2022年Java开发者生产力报告》称:八年前发布的 Java8 依然是 Java 中应用最广泛的版本,占比 37%,其次是 Java11,占比 29%。
高斯林说话:
Spring 框架说话:
在
Java17
正式发布之前,Java开发框架 Spring 率先在官博宣布,Spring Framework 6 和 Spring Boot 3 计划在 2022 年第四季度实现总体可用性的高端基线:
- Java17+(来自 Spring Framework 5.3.x 线中的 Java 8-17)
- Jakarta EE 9+(来自 Spring 框架 5.3.x 线中的 Java EE 7-8)
Spring官方说明:https://spring.io/blog/2022/01/20/spring-boot-3-0-0-m1-is-now-available
意味着:
Spring Boot 3.0 是需要用 java17 和 spring6.0 为基础建设。如果从企业选型最新 springboot3.0 作为架构来说,它搭配 JDK17 肯定是标配了。
JDK 下载
所有版本下载:Java archive
进入之后就是选择安装对应的版本及操作系统,我们这里安装 JDK17:
macOS:区分 M 系列(ARM64)与 Intel(x64)芯片
文件名 | 支持架构 | 适合芯片类型 | 安装方式 | 建议用途 |
---|---|---|---|---|
✅ jdk-17.0.14_macos-aarch64_bin.dmg | ARM64 | Apple M1 / M2 / M3 等 M 系列芯片 | 图形化安装(推荐) | ✅ Mac 新款(M 芯片)推荐 |
✅ jdk-17.0.14_macos-aarch64_bin.tar.gz | ARM64 | M 系列芯片 | 手动解压安装 | 适合高级用户或 Docker、脚本部署 |
✅ jdk-17.0.14_macos-x64_bin.dmg | x64 (Intel) | Intel 芯片(老款 Mac) | 图形化安装 | ✅ Intel Mac 推荐 |
✅ jdk-17.0.14_macos-x64_bin.tar.gz | x64 (Intel) | Intel 芯片 | 手动解压安装 | 同上,适合命令行部署或自定义路径 |
Apple M 系列用户 一定要选 aarch64 开头的版本(即 ARM64 架构),否则会用到 Rosetta 转译,影响性能。
Windows:全是 x64,区别在于安装方式
文件名 | 类型 | 安装方式 | 说明 | 建议用途 |
---|---|---|---|---|
✅ jdk-17.0.14_windows-x64_bin.exe | 安装包(.exe) | 图形化安装(推荐) | 支持自动添加环境变量、注册表等 | 普通 Windows 用户推荐 |
✅ jdk-17.0.14_windows-x64_bin.msi | MSI 安装包 | 可用于企业部署 | 多用于批量部署、组策略控制 | 有 IT 管理需求时选 |
✅ jdk-17.0.14_windows-x64_bin.zip | 压缩包 | 手动解压配置 | 需要自己配置 JAVA_HOME | 开发人员喜欢用,自由灵活 |
一般来说,普通 Windows 开发者直接下载 .exe 安装包即可,省心又自动。
小结:选择对照表
操作系统 | 芯片架构 | 推荐版本文件 | 安装方式 |
---|---|---|---|
macOS (M 系列) | ARM64 (aarch64) | jdk-17.0.14_macos-aarch64_bin.dmg | 图形化 |
macOS (Intel) | x64 | jdk-17.0.14_macos-x64_bin.dmg | 图形化 |
Windows | x64 | jdk-17.0.14_windows-x64_bin.exe | 图形化 |
Linux | x64 / ARM64 | 根据架构选择 .tar.gz 或 .rpm | 通常解压部署 |
JDK 安装
安装说明:
傻瓜式安装,下一步即可,建议:安装路径不要有中文或者空格等特殊符号。
我们这里演示 Windows 下同时安装 JDK8 和 JDK17,并以 JDK17 为默认版本进行讲解。
安装步骤:
双击 jdk-17_windows-x64_bin.exe 文件,并单击下一步

修改安装路径,单击更改

将安装路径修改为 D:\develop_tools\jdk\jdk-17.0.2\,并单击下一步

稍后几秒,安装完成


配置 path 环境变量
理解 path 环境变量
什么是 path 环境变量?
window
操作系统执行命令时,所要搜寻的路径
。为什么配置 path?
配置 PATH 是为了
告诉操作系统在哪里可以找到可执行文件
。当你在命令行中输入一个命令时,操作系统会按照 PATH 变量指定的路径顺序去搜索这个命令对应的可执行文件
。 如果没有配置 PATH 或者路径设置不正确,你就需要在执行命令时输入完整的路径,这会变得很不方便。例如,在 Windows 系统上,如果你将 Python 安装在 C:\Python39 目录下,并且将该目录添加到 PATH 变量中,那么无论你在命令行中当前所处的目录是什么,只要你输入 python 命令, 系统就会找到 C:\Python39\python.exe 并执行它,而不需要输入完整的路径。
因此,配置 PATH 可以提高命令行操作的便利性和效率。
以 JDK 为例演示
我们在 C:\Users\songhk 目录下使用 javac 命令,结果如下:
我们在 JDK 的安装目录的
bin
目录下使用 javac 命令,结果如下:
我们不可能每次使用 java.exe、javac.exe 等工具时,都进入到 JDK 的安装目录下,太麻烦了, 这时就需要配置 path 环境变量,希望在命令行使用 javac.exe 等工具时,任意目录下都可以找到这个工具所在的目录。
JDK8 配置方案一:只配置 PATH
步骤:
打开桌面上的计算机,进入后在左侧找到此电脑,单击鼠标右键,选择属性:
选择高级系统设置:
在高级选项卡,单击环境变量:
在系统变量中,选中
Path
环境变量,双击或点击编辑:点击新建,填入 JDK 安装目录下
bin
文件目录如D:\xxx\jdk\jdk1.8.0_271\bin
,并将此值 上移 到变量列表的首位:编辑模式一:
编辑模式二:(注意,结尾需要有英文模式下的分号;)
环境变量配置完成,重新打开 DOS 命令行,在任意目录下输入
javac
或java
或java -version
,运行成功:
JDK8 配置方案二(推荐):配置 JAVA_HOME + PATH

步骤:
打开桌面上的计算机,进入后在左侧找到 计算机,单击鼠标右键,选择属性:
选择高级系统设置:
在高级选项卡,单击环境变量:
在系统变量中,单击新建 ,创建新的环境变量:
变量名输入
JAVA_HOME
,变量值输入 JDK 安装目录如D:\xxx\jdk\jdk1.8.0_271
,单击确定:选中
Path
环境变量,双击或点击编辑 :在变量值的最前面,键入
%JAVA_HOME%\bin
:
⚠️ 注意
强烈建议将 %JAVA_HOME%\bin
声明在 path
环境变量中所有变量的最前面!
环境变量配置完成,重启 DOS 命令行,在任意目录下输入
javac
或java
或java -version
,运行成功:
⚠️ 注意
有的书籍、论坛、视频上还提到配置 classpath
,用于指名 class
文件识别的路径,
其实是没必要的,反而建议大家如果配置了 classpath
环境变量,要删除,对于初学者,反而不友好。
JDK17 配置方案:自动配置
不管大家有没有提前安装 JDK8 或其它版本 JDK,在我们安装完 JDK17 之后,理应按 JDK8 的方式配置
Path
环境变量。 但是,我们发现在安装完 JDK17 以后,配置环境变量之前,执行 CMD 指令:

竟然成功了!而且是17.0.2版本。因为 JDK17 在安装之后,
自动进行了环境变量的配置
。如下:

这里建议,将
JDK17
安装的路径,设置为JAVA_HOME
,并将%JAVA_HOME%\bin
上移到首位


思考:如果你仍然希望在
JDK8
下开发Java
程序?如何做呢?
Windows 切换 JDK 版本
方法一:修改系统环境变量
编辑 PATH,把你想使用的 JDK 的 bin 路径移到最前。
设置/修改 JAVA_HOME 指向目标版本的 JDK 根目录。
可选:在 PATH 中添加 %JAVA_HOME%\bin(这样只需要切换 JAVA_HOME 即可切换版本)。
方法二:写多个 .bat 脚本快速切换(适合开发)
:: use-jdk8.bat
@echo off
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_341
set PATH=%JAVA_HOME%\bin;%PATH%
:: use-jdk17.bat
@echo off
set JAVA_HOME=C:\Program Files\Java\jdk-17
set PATH=%JAVA_HOME%\bin;%PATH%
双击或在终端运行某个脚本,即可在当前 cmd 会话中切换 JDK 版本(注意:只影响当前窗口)。
方法三:第三方图形工具(可选)
JDKSwitcher、Java Version Switcher 或通过 IntelliJ IDEA 的 Project SDK 设置临时选择项目使用的 JDK。
MacOS 切换 JDK 版本
方法一:临时切换(当前终端有效)
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
# 或者切换到 JDK17:
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
# 查看:
echo $JAVA_HOME
方法二:永久切换
# 编辑 ~/.zshrc 或 ~/.bash_profile,添加:
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
export PATH=$JAVA_HOME/bin:$PATH
保存后运行:
source ~/.zshrc
方法三:工具辅助(可选)
jEnv:像 nvm 一样管理 Java 版本,支持全局和项目级 Java 版本切换。
或通过 IntelliJ IDEA 的 Project SDK 设置临时选择项目使用的 JDK。
八. 开发体验:HelloWorld
安装好 JDK 后,我们可以开始编写第一个 Java 程序了,习惯上称为「HelloWorld」。
Java 程序开发的三大步骤
① 编写:将 Java 代码写入以 .java 为后缀的源文件中。
② 编译:使用 javac 命令将 .java 文件编译成 .class 字节码文件(一个或多个)。
③ 运行:使用 java 命令运行 .class 字节码文件。

第一步:编写 Java 源代码
① 创建源文件
在 D:\JavaSE\chapter01 目录下新建一个名为 HelloWorld 的文件,后缀格式必须为.java。
② 使用编辑器编写代码
建议使用带语法高亮的编辑器(如 VSCode、EditPlus、Notepad++ 等),避免使用记事本。
输入如下代码并保存:
javaclass HelloChina { public static void main(String[] args) { System.out.println("HelloWorld!!"); } }
⚠️ 注意
本示例刻意使用
HelloWorld.java
存放class HelloChina
,是为了说明:后面进行编译操作时,所生成的
.class
字节码文件名,并不是由源文件名决定的,而是由类名决定的。
Java 文件命名规则说明:
类是否为 public | 源文件名是否必须与类名一致 | 说明 |
---|---|---|
✅ 是 | ✅ 是 | 必须一致,且区分大小写,否则编译失败 |
❌ 否 | ❌ 否(可不一致) | 但强烈建议一致,有助于维护与识别 |
提示
- 每个字符、大小写和标点都必须与示例完全一致。
- 如果你在 Windows 中看不到文件后缀,建议先取消隐藏已知文件类型扩展名:

- 或

第一个 HelloWord 源程序就编写完成了,但是这个文件是程序员编写的,JVM 是看不懂的,也就不能运行, 因此我们必须将编写好的
.java 源文件编译成 JVM 可以看懂的字节码文件(即 .class 文件)
。
第二步:编译 Java 源文件
① 打开命令行终端
使用资源管理器打开 D:\JavaSE\chapter01 目录,在地址栏输入 cmd 并回车,打开命令行窗口:
② 编译源代码
在 cmd 中,使用 javac 命令对 .java 源文件进行编译,运行命令格式:
shelljavac 源文件名.java
在 cmd 中输入:
shelljavac HelloWorld.java
如下所示:
编译成功后,命令行没有任何提示,打开 D:\JavaSE\chapter01 目录,发现生成了一个名为
HelloChina.class
的新文件,该文件就是编译后的字节码文件
,是 Java 的可运行文件
,有了字节码文件就可以运行程序了。
第三步:运行字节码文件
使用 java 命令执行字节码文件,运行命令格式:
bashjava 主类名 # 如 HelloChina
示例(不要加 .class 后缀):
bashjava HelloChina # ✅ 正确 java HelloChina.class # ❌ 错误
⚠️ 注意
Java 的 java 命令运行的是
类名
,不是文件名或 .class 后缀格式的文件名。运行入口说明:
Java 程序的
主类
是指包含 main 方法的类,main 方法是程序的入口方法:javaclass HelloChina { public static void main(String[] args) { // 程序入口 } }
效果如下:
新特性:直接运行源文件
引言
从 Java 11
开始,为了简化小型脚本或测试代码的执行过程,java 命令支持直接编译并运行 .java 源文件,无需使用 javac 手动编译。
步骤如下:
① 确认 JDK 版本为 11 或以上
你需要确保你的 JDK 版本是 11 或更高版本。你可以通过运行以下命令来检查 Java 版本:
shelljava -version
② 编写源文件(HelloWorld.java):
创建一个 Java 源文件,例如 HelloWorld.java,内容如下:
javapublic class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
③ 直接运行(无需先编译):
使用 java 命令直接运行源文件,而不需要先使用 javac 进行编译:
bashjava HelloWorld.java
原理说明:
- 该功能由 Java 运行时自动完成:
临时编译源文件 → 执行生成的字节码 → 自动清理中间产物
- 适用于:快速测试、小型脚本等开发场景。
详细信息
这个特性是在 Java 11 中引入的,主要为了提高开发效率,尤其是对于一些简单的脚本或一次性的小程序。其背后的机制是 Java 运行时会临时编译这个源文件,然后立即运行生成的字节码。这个过程对用户是透明的,因此你感觉就像直接运行源文件一样。
该特性可以大大简化开发者在编写和测试小型程序时的操作步骤。通过这种方式,你无需显式地进行编译,可以直接在命令行中运行 Java 源文件。
小结
步骤 | 传统方式(适用于所有版本) | Java 11+ 新方式(仅限简单类) |
---|---|---|
编译 | javac HelloWorld.java | 无需手动编译 |
运行 | java HelloWorld | java HelloWorld.java |
九. Java 开发工具
01. 都有哪些开发Java的工具
级别一:文本开发工具
级别二:集成开发环境(Integrated Development Environment,IDE)
把代码编写,编译,执行,调试等多种功能综合到一起的开发工具
02. 如何选择
前期我们先使用文本开发工具,培养代码感,利于公司笔、面试
后期我们使用 IDE,提供更强大的功能支持
十. 常见问题:编译运行路径、字符编码
01. 拼写问题
- 单词拼写问题
// 正确
class、String、System、main
// 错误
Class、string、system、mian
Java 语言是一门严格区分大小写的语言
标点符号使用问题
不能用中文符号,英文半角的标点符号
括号问题,成对出现
02. 编译、运行路径问题
举例1:
源文件名不存在或写错
当前路径错误
后缀名隐藏问题
举例2:
类文件名写错,尤其文件名与类名不一致时,要小心
类文件不在当前路径下,或者不在
classpath
指定路径下
03. 语法问题
举例1:
- 声明为 public 的类必须与文件名一致,否则编译失败
举例2:
- 编译失败,注意错误出现的行数,再到源代码中指定位置改错
04. 字符编码问题
当 DOS 命令行窗口的字符编码与
.java
源文件的字符编码不一致,如何解决?解决方案一:
在
Notepad++
等编辑器中,修改源文件的字符编码:在
EditPlus
中可以将 Java 源文件另存为ANSI
编码方式(中文操作系统下即为GBK
字符集)
解决方案二:
cmd# 在使用 javac 命令时,可以指定源文件的字符编码 javac -encoding utf-8 demo01.java # demo01为文件名
总结:
在 win10 系统中,由于我们设置的区域是中国大陆,所以系统默认的编码格式是简体中文的 GBK 编码,在 Windows 中常用于处理中文字符。所以导致在使用 javac 编译文件时出现中文乱码的原因
在 Windows 系统上,你可以通过命令行查看系统的默认编码格式
shellchcp # 显示当前的命令行编码
- 常见的 UTF-8 编码对应的代码页是 65001。如果你看到代码页是 65001,那么当前的命令行编码就是 UTF-8
- 936 对应的是 简体中文的 GBK 编码
最终解决
- 前面两种方式都不提倡,不可能每次保存时还去修改编码格式,也不可能将编辑器的保存格式修改,这样会导致别的文件编码格式有问题
- 在全局配置中设置 javac 编译器的字符编码为 UTF-8,使用 JAVA_TOOL_OPTIONS 环境变量
- 在 Windows 上,按照以下步骤进行设置:
- 打开系统环境变量设置:
- 右键点击此电脑/我的电脑 -> 属性 -> 高级系统设置 -> 环境变量
- 创建
JAVA_TOOL_OPTIONS
环境变量:- 在“系统变量”部分点击“新建”
- 变量名输入
JAVA_TOOL_OPTIONS
- 变量值设置为
-Dfile.encoding=UTF-8
- 点击“确定”保存设置
- 重启命令提示符或其他编译器: 为了让变更生效,关闭并重新打开命令提示符或其他编译器
- 打开系统环境变量设置:
- 这样设置后,javac 编译器应该默认使用 UTF-8 字符编码进行编译。任何通过 javac 编译的文件都会使用 UTF-8 编码进行处
测试结果:
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
意思是:
这个信息是
Java
运行时环境(JRE)或者开发工具(JDK)在启动时检测到了一个名为JAVA_TOOL_OPTIONS
的环境变量,并且发现它设置了一个属性-Dfile.encoding=UTF-8
-Dfile.encoding=UTF-8
表示设置了一个系统属性,告诉Java
使用UTF-8
编码来处理文件
当你设置
JAVA_TOOL_OPTIONS
环境变量并赋予它-Dfile.encoding=UTF-8
这个值后,Java
运行时会读取这个环境变量并在启动时应用这个属性。这意味着任何使用Java
编程语言进行的文件读写、字符编码等操作都会使用UTF-8
这种编码方式
05. 建议
注意缩进!
一定要有缩进。缩进就像人得体的衣着一样!
只要遇到
{}
就缩进,缩进的快捷键tab
键
必要的空格
- 变量类型、变量、赋值符号、变量值之间填充相应空格,更美观。比如:
int num = 10
- 变量类型、变量、赋值符号、变量值之间填充相应空格,更美观。比如:
十一. HelloWorld 小结
01. Java 程序的结构与格式
结构:
java类{ 方法{ 语句; } }
格式:
- 每一级缩进一个
Tab
键 {}
的左半部分在行尾,右半部分单独一行,与和它成对的"{"的行首对齐
- 每一级缩进一个
02. Java 程序的入口
Java 程序的入口是 main 方法:
javapublic static void main(String[] args){}
03. 两种常见的输出语句
换行输出语句:输出内容,完毕后进行换行,格式如下:
javaSystem.out.println("输出内容");
直接输出语句:输出内容,完毕后不做任何处理,格式如下
javaSystem.out.print("输出内容");
注意:
换行输出语句,括号内可以什么都不写,只做换行处理
直接输出语句,print()括号内什么都不写的话,编译报错
04. 源文件名与类名
源文件名是否必须与类名一致?public 呢?
如果这个类不是 public,那么源文件名可以和类名不一致。但是不便于代码维护
如果某个类用 public 修饰,那么源文件名必须与该类名一致。否则编译报错
我们建议大家,不管是否是
public
,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护
一个源文件中是否可以有多个类?public 呢?
一个源文件中可以有多个类,编译后会生成多个
.class
字节码文件但是一个源文件只能有一个
public
的类
总结:
一个 java 源文件中可以有多个类,但是最多只能声明一个 public 类
public 类的类名与源文件名必须一致
十二. 注释(comment)

什么是注释?
- 源文件中用于解释、说明程序的文字就是注释
注释是一个程序员必须要具有的良好编程习惯。实际开发中,程序员可以先将自己的思想通过注释整理出来,再用代码去体现
程序员最讨厌两件事:
一件是自己写代码被要求加注释
另一件是接手别人代码,发现没有注释
不加注释的危害
Java 中的注释类型:
单行注释
java// 注释文字
多行注释
java/* 注释文字1 注释文字2 注释文字3 */
文档注释 (Java特有)
java/** @author 指定java程序的作者 @version 指定源文件的版本 */
注释的作用
- 它提升了程序的可阅读性(不加注释的危害性,见图)
- 调试程序的重要方法
具体使用1:单行注释、多行注释
对于单行和多行注释,被注释的文字,不会出现在字节码文件中,也就不会被
JVM
(java
虚拟机)解释执行多行注释里面不允许有多行注释嵌套
一个段子
javaA:嘿 //是什么意思啊? B:嘿. A:呃 我问你//是什么意思? B:问吧. A:我刚才不是问了么? B:啊? A:你再看看记录... B:看完了. A:......所以//是啥? B:所以什么? A:你存心耍我呢吧? B:没有啊 你想问什么? …… 不断循环之后,A一气之下和B绝交,自己苦学程序。 N年之后,A终于修成正果,回想起B,又把聊天记录翻出来看,这时,他突然发现B没有耍他…… 而他自己也不知道当年他问B的究竟是什么问题……
具体使用2:文档注释(Java特有)
文档注释内容可以被 JDK 提供的工具
javadoc
所解析,生成一套以网页文件形式体现的该程序的说明文档操作方式,如:
shelljavadoc -d mydoc -author -version HelloWorld.java
案例:
java//单行注释 /* 多行注释 */ /** 文档注释演示。这是我的第一个Java程序!^_^ @author songhk @version 1.0 */ public class HelloWorld{ /** Java程序的入口 @param args main方法的命令参数 */ public static void main(String[] args){ System.out.println("hello"); } }
十三. Java API 文档
API
(Application Programming Interface
,应用程序编程接口)是 Java 提供的基本编程接口Java 语言提供了大量的基础类,因此
Oracle
也为这些基础类提供了相应的说明文档,用于告诉开发者如何使用这些类,以及这些类里包含的方法。大多数 Java 书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料Java
API
文档,即为JDK
使用说明书、帮助文档。类似于:下载
API
文档:
十四. Java 运行环境:JVM(java虚拟机)
01. Java 语言的优缺点
- Java 确实是从
C
语言和C++
语言继承了许多成份,甚至可以将 Java 看成是类C
语言发展和衍生的产物。“青出于蓝,而胜于蓝”。
优点
**跨平台性:**这是 Java 的核心优势。Java 在最初设计时就很注重移植和跨平台性。比如:Java 的 int
永远都是 32
位。不像 C++
可能是16,32,可能是根据编译器厂商规定的变化。
- 通过
Java语言编写的应用程序在不同的系统平台上都可以运行
。“Write once , Run Anywhere”。 - 原理:只要在需要运行 java 应用程序的操作系统上,先安装一个 Java 虚拟机 (JVM ,Java Virtual Machine) 即可。由
JVM
来负责 Java 程序在该系统中的运行。

- 面向对象性:
- 面向对象是一种程序设计技术,非常适合大型软件的设计和开发。面向对象编程支持封装、继承、多态等特性,让程序更好达到高内聚,低耦合的标准
健壮性:
吸收了C/C++语言的优点
,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
安全性高:
- Java 适合于网络/分布式环境,需要提供一个安全机制以防恶意代码的攻击
- 如:
安全防范机制
(ClassLoader
类加载器),可以分配不同的命名空间以防替代本地的同名类、字节代码检查
简单性:
- Java 就是
C++语法的简化版
,我们也可以将 Java 称之为“C++--
” - 比如:头文件,指针运算,结构,联合,操作符重载,虚基类等
- Java 就是
高性能:
- Java 最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免
- Java 语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过
JIT(JUST IN TIME)
即时编译技术提高运行效率JIT
:热点代码编译成机器代码,后续使用直接使用之前编译后的机器代码
- Java 低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多 C++ 应用转到 Java 开发,很多 C++ 程序员转型为 Java 程序员
缺点
- 语法过于复杂、严谨,对程序员的约束比较多,与
python
、php
等相比入门较难。但是一旦学会了,就业岗位需求量大,而且薪资待遇节节攀升 - 一般适用于大型网站开发,整个架构会比较重,对于初创公司开发和维护人员的成本比较高(即薪资高),选择用 Java 语言开发网站或应用系统的需要一定的经济实力
- 并非适用于所有领域。比如,
Objective C
、Swift
在iOS
设备上就有着无可取代的地位。浏览器中的处理几乎完全由JS
掌控。Windows
程序通常都用C++
或C#
编写。Java 在服务器端编程和跨平台客户端应用领域则很有优势
02. JVM 功能说明
JVM(Java Virtual Machine ,Java虚拟机):是一个虚拟的计算机,是 Java 程序的运行环境
JVM
具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器
功能一:实现 Java 程序的跨平台性
我们编写的 Java 代码,都运行在
JVM
之上,正是因为有了JVM
,才使得 Java 程序具备了跨平台性使用
JVM
前后对比:
功能二:自动内存管理(内存分配、内存回收)
- Java 程序在运行过程中,涉及到运算的数据的分配、存储等都由
JVM
来完成 - Java 消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间
GC
的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏
- 内存溢出:内存超出内存最大容量
- 内存泄露:无用的内存占用
十五. 章节案例
案例1:个人信息输出
javaclass Exercise1{ public static void main(String[] args){ System.out.println("姓名:康师傅"); System.out.println("性别:男"); System.out.println("家庭住址:北京程序员聚集地:回龙观"); } }
案例2:输出:心形
结合
\n
(换行newline),\t
(制表符tab),空格等在控制台打印出如下图所示的效果
方式一:
javapublic class StarPrintTest { public static void main(String[] args) { System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("*"); System.out.print("\t"); //System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("I love java"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print(" "); System.out.print("*"); } }
方式二:
javapublic class StarPrintTest { public static void main(String[] args) { System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n"); System.out.print("*"+"\t\t"+"*"+"\t\t\t\t"+"I love Java"+"\t\t\t\t"+"*"+"\t\t\t"+"*"+"\n"); System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n"); System.out.print("\t\t"+"*"+"\t\t\t\t\t\t\t\t\t\t"+"*"+"\t\t"+"\n"); System.out.print("\t\t\t"+"*"+"\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n"); System.out.print("\t\t\t\t"+"*"+"\t\t\t\t\t\t"+"*"+""+"\t"+"\n"); System.out.print("\t\t\t\t\t"+"*"+"\t\t\t\t"+"*"+""+"\t\t"+"\n"); System.out.print("\t\t\t\t\t\t"+"*"+"\t\t"+"*"+""+"\t\t"+"\n"); System.out.print("\t\t\t\t\t\t\t"+"*"+"\n"); } }
十六. 如何看待Java是一门半编译半解释型的语音
字节码编译到机器码的过程:部分代码走解释器解释执行,部分热点代码走JIT编译器编译执行。