Skip to content

一. Java 知识脉络图

Java 基础全程脉络图

Java基础全程脉络图

本章专题与脉络

二. 抽丝剥茧话 Java

当前大学生就业形势

麦可思研究院 发布了《2022年中国大学生就业报告》,针对2021届毕业生收入较高的本科专业排行榜:

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

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

从国家统计局发布的2021年全国平均工资来看,不管在城镇非私营单位还是私营单位,IT业均为最高

IT互联网是否依旧靠谱

过去不能代表未来!互联网是否依旧靠谱?

image-20220523002428542

2014 年至 2018 年间,我国网民规模从 6.49 亿增长为 8.29 亿,增幅为 27.5%。同一时间段,全国移动互联网接入的流量却从 20.6EB 增长到了 711.1EB,增幅达 3352%(获取和处理的信息量大幅增加)。

随着 5G 技术进一步拓宽移动互联网的速度和容量,产业互联网将在消费型流量的基础上创造生产型流量,根据报告的预测,至 2024 年,全国移动互联网的接入流量将达到 127663.8EB, 流量规模达到2018年的179.5倍。

当下,5G、物联网、人工智能、产业互联网都是国家政策大方向,需要大量能与机器对话的中高端人才。

IT行业岗位分析

image-20220522234544537

软件开发,是进入互联网IT圈最好的选择之一!

起始薪资高、工作环境好、涨薪幅度高、行业更公平

软件开发之 Java 开发

image-20220504101615999image-20220608160444947

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

image-2022051109264912220220608_160310

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

image-20220511090528043

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

image-20220511091647358image-20220513233529610

Eversoft 公司在提到 2022 年 Java 发展趋势时写道:

Java 是用于开发大数据项目的最主流的语言。我们可以轻松地预测它也将在之后继续主导大数据!

4. 游戏领域、桌面应用、嵌入式领域:很多大型游戏的后台、桌面应用等也是 Java 开发的。

到底多少人在用 Java

2020年,根据 IDC 的报告“Java Turns 25”显示,超过 900万 名开发人员(全球专职开发人员中的 69%)在使用 Java — 比其他任何语言都多。该报告指出,大多数企业业务服务都依靠 Java 来实现。

Java 一直是开发人员中最流行的编程语言,被誉为“宇宙第一语言

我想告诉大家:

“市场的需求比较大,市场的供给比较大”。
“如果你在 Java 领域里持续积累5-7年以上,那么你至少会成为这个行业的一个专家!”

八卦一下程序员

image-20220602105134523

还可以是:

image-20220602105213557

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 类型:

名称全称说明
bashBourne Again SHellLinux 与早期 macOS 默认 Shell,简单、稳定
zshZ Shell功能更强大,支持自动补全、语法高亮、更好的配置扩展

🕰️ 历史渊源与变化
早期版本的 macOS(10.15 Catalina 之前)默认使用的是 bash。
从 macOS 10.15 Catalina 起(2019 年),Apple 将默认的 Shell 改成了 zsh。

原因之一是 bash 的新版使用了 GPLv3 协议,而 Apple 不愿将其引入系统中。

不过你仍然可以随时切换使用 bash 或 zsh,它们都是兼容 POSIX 的 Shell,有很多命令是通用的。

🔄 如何查看/切换当前 Shell?

  • 查看当前使用的 Shell
bash
echo $SHELL

输出如 /bin/zsh 表示你正在使用 zsh。

  • 临时切换(当前窗口有效)
bash
bash    # 切换到 bash
zsh     # 切换回 zsh
  • 永久更改默认 Shell
bash
chsh -s /bin/zsh    # 设置默认使用 zsh
chsh -s /bin/bash   # 设置默认使用 bash

CMD 与 Terminal 命令对照表

⚠️ 注意

关于文件系统对大小写的敏感性问题,不同操作系统默认行为如下:

操作系统默认是否区分大小写是否可改为区分大小写说明
Windows❌ 不区分⚠️技术支持但不推荐在 NTFS 文件系统中,虽然技术上支持大小写区分,但 Windows 默认行为是不区分的(即 file.txtFile.txt 视为同一个文件)。
macOS❌ 不区分✅ 可格式化为区分默认使用 APFS (不区分大小写) 或 HFS+ (大小写不敏感),但可格式化为区分大小写的版本,如 APFS (区分大小写)。大多数用户使用的是不区分大小写的版本,开发者可手动创建区分大小写的卷或磁盘镜像。
Linux✅ 区分✅ 可选常见文件系统(如 ext4、xfs 等)默认严格区分大小写,file.txtFile.txt 被认为是两个不同文件。

开发建议始终按照大小写敏感方式书写文件名和引用路径(即便在 macOS/Windows 测试通过)。

目录操作

操作Windows CMDmacOS Terminal说明
查看当前路径cdpwdCMD 中 cd 显示当前目录;macOS 用 pwd(print working directory)
查看目录内容dirls列出当前目录下的文件和文件夹
进入目录cd 目录名cd 目录名支持相对路径或绝对路径
进入多级目录cd dir1\dir2cd dir1/dir2
返回上一级cd ..cd ..返回上一层目录
返回根目录cd \cd /Windows 回到盘符根目录;mac 回到文件系统根目录
切换盘符<盘符名称>:(如D: 表示切换到D盘)⛔ 不适用(Mac 无盘符)Windows 可切换多盘符;macOS 默认只有一个文件系统结构

创建 / 删除目录与文件

操作Windows CMDmacOS Terminal说明
创建目录md 目录名mkdirmkdir 目录名创建一个新目录
删除空目录rd 目录名rmdir 目录名rm -d 目录名仅能删除空目录
强制删除非空目录rd /s /q 目录名rm -rf 目录名危险操作,强制递归删除所有内容
创建空文件echo. > 文件名touch 文件名CMD 中可用 echo. 重定向生成空文件
删除单个文件del 文件名rm 文件名删除指定文件
删除多个文件del *.txtrm *.txt使用通配符删除多个符合条件的文件

查看 / 编辑文件内容

⚠️ 注意

在终端执行编辑相关命令时,如果省略文件后缀,系统会创建一个新的无后缀同名文件,而不会修改已有的文件!为避免重复或误操作,请始终写出完整文件名(含后缀)

写完整文件后缀,可被大多数系统/编辑器自动识别,更容易被其他人或工具识别用途。

操作Windows CMDmacOS 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 CMDmacOS Terminal说明
清屏clsclear清空当前终端显示内容
退出终端exitexit关闭命令行窗口
历史命令↑ / ↓↑ / ↓history调阅历史命令
删除字符Backspace / DeleteBackspace / Delete删除输入中的字符
自动补全路径Tab(部分版本支持)Tab自动补齐文件夹/文件名
删除光标前整行(清空)EscCtrl + UCMD 无法一键删除光标前文本,只能手动或清空整行
删除光标前一个单词Ctrl + WCMD 不支持「按单词」删除
清空整行Esc 多次Ctrl + U(Zsh 下)只能通过 Backspace 或重新输入来「模拟清空」
光标移动到行首HomeCtrl + ACMD 中使用 Home 键将光标移至行首
光标移动到行尾EndCtrl + ECMD 中使用 End 键将光标移至行尾

五. 计算机编程语言

什么是计算机语言?

语言:是人与人之间用于沟通的一种方式。

例如:中国人与中国人用普通话沟通,而中国人要和英国人交流,可以使用英语或普通话。

计算机编程语言:就是人与计算机交流的方式。

人们可以使用 编程语言 对计算机下达 命令,让计算机按照命令完成人们需要的功能。

语言 = 语法 + 逻辑,计算机语言有很多种:

例如:C、C++、Java、Go、JavaScript、Python,Scala 等。

计算机语言简史

第一代:机器语言(相当于人类的石器时代)

1946年2月14日,世界上第一台计算机 ENAC 诞生,使用的是最原始的 穿孔卡片,这种卡片上使用的是用 二进制代码 表示的语言,与人类语言差别极大,这种语言就称为机器语言。

比如一段典型的机器码:

md
1.	0000,0000,000000010000 代表 LOAD A, 16
2.	0000,0001,000000000001 代表 LOAD B, 1
3.	0001,0001,000000010000 代表 STORE B, 16

机器语言本质上是计算机能识别的唯一语言,人类很难理解。可以大胆想象"此时的程序员99.9%都是异类!"

image-20220309223406537

第二代:汇编语言(相当于人类的青铜&铁器时代)

使用 英文缩写的助记符 来表示基本的操作,这些助记符构成了汇编语言的基础。比如:LOAD、MOVE 等,使人更容易使用,因此汇编语言也称为 符号语言

优点:能编写相对较高效率的程序。

缺点:汇编语言是面向机器的,不同计算机机型特点不同,因此会有不同的汇编语言,彼此之间 不能通用,程序不易移植,较难调试。

比起机器语言,汇编大大进步了,是机器语言向更高级的语言进化的桥梁,目前仍然应用于工业电子编程领域、软件的加密解密、计算机病毒分析等。

第三代:高级语言(相当于人类的信息时代)

高级语言发展于20世纪50年代中叶到70年代,是一种接近于人们使用习惯的程序设计语言, 它允许程序员使用 接近日常英语的指令 来编写程序,程序中的符号和算式也与日常用的数学式子差不多,接近于自然语言和数学语言,容易为人们掌握。比如:

高级语言独立于机器,有一定的通用性。

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

此外,高级语言按照程序设计方法的不同,又分为:面向过程的语言、面向对象的语言

  • C、Pascal、Fortran 面向过程的语言
  • C++ 面向过程/面向对象
  • Java 跨平台的纯面向对象的语言
  • C#、Python、JavaScript、Scala…

目前以及可预见的将来,计算机语言仍然处于“第三代高级语言”阶段。但是不管是什么语言,最后都要向机器语言靠近,因为 CPU 只认识 0 和 1。

计算机语言排行榜

TIOBE是一个流行编程语言排行,每月更新。排名权重基于世界范围内工程师数量,Google、Bing、Yahoo! 、Wikipedia、Amazon、Youtube 和百度这些主流的搜索引擎,也将作为排名权重的参考指标。

计算机语言走势

编程语言,该学哪个?

网传的编程语言鄙视链:

image-20220310151750665

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.01996.01.23Sun公司发布了Java的第一个开发工具包
Java 1.11997.02.19JavaOne会议召开,创当时全球同类会议规模之最。
Java 1.21998.12.08Java拆分成:J2SE(标准版)、J2EE(企业版)、J2ME(小型版)
Java 1.32000.05.08
Java1.42004.02.06
Java 5.02004.09.30① 版本号从1.4直接更新至5.0;② 平台更名为JavaSE、JavaEE、JavaME
Java 6.02006.12.112009.04.20 Oracle宣布收购SUN公司
2009.04.20Oracle公司收购SUN,交易价格74亿美元
Java 7.02011.07.02
Java 8.02014.03.18此版本是继Java 5.0以来变化最大的版本。是长期支持版本(LTS)
Java 9.02017.09.22① 此版本开始,每半年更新一次;② Java 9.0开始不再支持windows 32位系统
Java 10.02018.03.21
Java 11.02018.09.25JDK 安装包取消独立 JRE 安装包,是长期支持版本(LTS)
Java 12.02019.03.19
......
Java17.02021.09发布Java 17.0,版本号也称为21.9,是长期支持版本
......
Java19.02022.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。

java
//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.dmgARM64Apple M1 / M2 / M3 等 M 系列芯片图形化安装(推荐)✅ Mac 新款(M 芯片)推荐
jdk-17.0.14_macos-aarch64_bin.tar.gzARM64M 系列芯片手动解压安装适合高级用户或 Docker、脚本部署
jdk-17.0.14_macos-x64_bin.dmgx64 (Intel)Intel 芯片(老款 Mac)图形化安装✅ Intel Mac 推荐
jdk-17.0.14_macos-x64_bin.tar.gzx64 (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.msiMSI 安装包可用于企业部署多用于批量部署、组策略控制有 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)x64jdk-17.0.14_macos-x64_bin.dmg图形化
Windowsx64jdk-17.0.14_windows-x64_bin.exe图形化
Linuxx64 / 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 命令行,在任意目录下输入 javacjavajava -version,运行成功:

JDK8 配置方案二(推荐):配置 JAVA_HOME + PATH

  • 步骤:

    打开桌面上的计算机,进入后在左侧找到 计算机,单击鼠标右键,选择属性:

    选择高级系统设置:

    在高级选项卡,单击环境变量:

    在系统变量中,单击新建 ,创建新的环境变量:

    变量名输入 JAVA_HOME,变量值输入 JDK 安装目录如 D:\xxx\jdk\jdk1.8.0_271,单击确定:

    选中 Path 环境变量,双击或点击编辑 :

    在变量值的最前面,键入 %JAVA_HOME%\bin

⚠️ 注意

强烈建议将 %JAVA_HOME%\bin 声明在 path 环境变量中所有变量的最前面!

  • 环境变量配置完成,重启 DOS 命令行,在任意目录下输入 javacjavajava -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 脚本快速切换(适合开发)

bat
:: use-jdk8.bat
@echo off
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_341
set PATH=%JAVA_HOME%\bin;%PATH%
bat
:: 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 版本

方法一:临时切换(当前终端有效)

bash
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
# 或者切换到 JDK17:
export JAVA_HOME=$(/usr/libexec/java_home -v 17)
bash
# 查看:
echo $JAVA_HOME

方法二:永久切换

bash
# 编辑 ~/.zshrc 或 ~/.bash_profile,添加:
export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)
export PATH=$JAVA_HOME/bin:$PATH

保存后运行:

bash
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++ 等),避免使用记事本。

    输入如下代码并保存:

    java
    class 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 源文件进行编译,运行命令格式

    shell
    javac 源文件名.java

    在 cmd 中输入:

    shell
    javac HelloWorld.java

    如下所示:

编译成功后,命令行没有任何提示,打开 D:\JavaSE\chapter01 目录,发现生成了一个名为 HelloChina.class 的新文件,该文件就是编译后的字节码文件,是 Java 的可运行文件,有了字节码文件就可以运行程序了。

第三步:运行字节码文件

  • 使用 java 命令执行字节码文件,运行命令格式:

    bash
    java 主类名 # 如 HelloChina

    示例(不要加 .class 后缀):

    bash
    java HelloChina        # ✅ 正确
    java HelloChina.class  # ❌ 错误

    ⚠️ 注意

    Java 的 java 命令运行的是类名,不是文件名或 .class 后缀格式的文件名。

  • 运行入口说明

    Java 程序的主类是指包含 main 方法的类,main 方法是程序的入口方法

    java
    class HelloChina {
        public static void main(String[] args) {
            // 程序入口
        }
    }
  • 效果如下:

新特性:直接运行源文件

引言

Java 11 开始,为了简化小型脚本或测试代码的执行过程,java 命令支持直接编译并运行 .java 源文件,无需使用 javac 手动编译

步骤如下

  • 确认 JDK 版本为 11 或以上

    你需要确保你的 JDK 版本是 11 或更高版本。你可以通过运行以下命令来检查 Java 版本:

    shell
    java -version
  • 编写源文件(HelloWorld.java)

    创建一个 Java 源文件,例如 HelloWorld.java,内容如下:

    java
    public class HelloWorld {
        public static void main(String[] args) {
            System.out.println("Hello, World!");
        }
    }
  • 直接运行(无需先编译)

    使用 java 命令直接运行源文件,而不需要先使用 javac 进行编译:

    bash
    java HelloWorld.java

原理说明

  • 该功能由 Java 运行时自动完成:

    临时编译源文件 → 执行生成的字节码 → 自动清理中间产物

  • 适用于:快速测试、小型脚本等开发场景。
详细信息

这个特性是在 Java 11 中引入的,主要为了提高开发效率,尤其是对于一些简单的脚本或一次性的小程序。其背后的机制是 Java 运行时会临时编译这个源文件,然后立即运行生成的字节码。这个过程对用户是透明的,因此你感觉就像直接运行源文件一样。

该特性可以大大简化开发者在编写和测试小型程序时的操作步骤。通过这种方式,你无需显式地进行编译,可以直接在命令行中运行 Java 源文件。

小结

步骤传统方式(适用于所有版本)Java 11+ 新方式(仅限简单类)
编译javac HelloWorld.java无需手动编译
运行java HelloWorldjava HelloWorld.java

九. Java 开发工具


01. 都有哪些开发Java的工具

  • 级别一:文本开发工具

    image-20220513185907022
  • 级别二:集成开发环境(Integrated Development Environment,IDE)

    • 把代码编写,编译,执行,调试等多种功能综合到一起的开发工具

      image-20220513190655773

02. 如何选择

  • 前期我们先使用文本开发工具,培养代码感,利于公司笔、面试

  • 后期我们使用 IDE,提供更强大的功能支持

十. 常见问题:编译运行路径、字符编码


01. 拼写问题

  • 单词拼写问题
java
// 正确
class、String、System、main
  
// 错误
Class、string、system、mian
  • Java 语言是一门严格区分大小写的语言

  • 标点符号使用问题

  • 不能用中文符号,英文半角的标点符号

  • 括号问题,成对出现

02. 编译、运行路径问题

  • 举例1:image-20220310231657692

    • 源文件名不存在或写错

    • 当前路径错误

    • 后缀名隐藏问题

  • 举例2:image-20220310231717893

    • 类文件名写错,尤其文件名与类名不一致时,要小心

    • 类文件不在当前路径下,或者不在 classpath 指定路径下

03. 语法问题

  • 举例1:image-20231118011046298

    • 声明为 public 的类必须与文件名一致,否则编译失败
  • 举例2:image-20220310231815405

    • 编译失败,注意错误出现的行数,再到源代码中指定位置改错

04. 字符编码问题

  • 当 DOS 命令行窗口的字符编码与 .java 源文件的字符编码不一致,如何解决?

    1557881223916
  • 解决方案一:

    • Notepad++ 等编辑器中,修改源文件的字符编码:

      1557881271819
    • EditPlus 中可以将 Java 源文件另存为 ANSI 编码方式(中文操作系统下即为 GBK 字符集)

      1658810752424
  • 解决方案二:

    cmd
    # 在使用 javac 命令时,可以指定源文件的字符编码
    javac -encoding utf-8 demo01.java # demo01为文件名

    总结:

    • 在 win10 系统中,由于我们设置的区域是中国大陆,所以系统默认的编码格式是简体中文的 GBK 编码,在 Windows 中常用于处理中文字符。所以导致在使用 javac 编译文件时出现中文乱码的原因

    • 在 Windows 系统上,你可以通过命令行查看系统的默认编码格式

      shell
      chcp # 显示当前的命令行编码
      • 常见的 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 编码进行处
    • 测试结果:

      image-20231210190709987
      • 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 方法:

    java
    public static void main(String[] args){}

03. 两种常见的输出语句

  • 换行输出语句:输出内容,完毕后进行换行,格式如下:

    java
    System.out.println("输出内容");
  • 直接输出语句:输出内容,完毕后不做任何处理,格式如下

    java
    System.out.print("输出内容");

注意:

  • 换行输出语句,括号内可以什么都不写,只做换行处理

  • 直接输出语句,print()括号内什么都不写的话,编译报错

04. 源文件名与类名

  • 源文件名是否必须与类名一致?public 呢?

    • 如果这个类不是 public,那么源文件名可以和类名不一致。但是不便于代码维护

    • 如果某个类用 public 修饰,那么源文件名必须与该类名一致。否则编译报错

      image-20231118011046298
    • 我们建议大家,不管是否是 public,都与源文件名保持一致,而且一个源文件尽量只写一个类,目的是为了好维护

  • 一个源文件中是否可以有多个类?public 呢?

    • 一个源文件中可以有多个类,编译后会生成多个 .class 字节码文件

      image-20231118010949478
    • 但是一个源文件只能有一个 public 的类

      image-20231118010838494

总结:

  • 一个 java 源文件中可以有多个类,但是最多只能声明一个 public 类

  • public 类的类名与源文件名必须一致

十二. 注释(comment)


image-20220610113151774
  • 什么是注释?

    • 源文件中用于解释、说明程序的文字就是注释
  • 注释是一个程序员必须要具有的良好编程习惯。实际开发中,程序员可以先将自己的思想通过注释整理出来,再用代码去体现

    程序员最讨厌两件事:

    • 一件是自己写代码被要求加注释

    • 另一件是接手别人代码,发现没有注释

  • 不加注释的危害

  • Java 中的注释类型

    • 单行注释

      java
      //	注释文字
    • 多行注释

      java
      /* 
      	注释文字1
      	注释文字2
      	注释文字3
      */
    • 文档注释 (Java特有)

      java
      /**
      	@author	指定java程序的作者
      	@version	指定源文件的版本
      */
  • 注释的作用

    • 它提升了程序的可阅读性(不加注释的危害性,见图)
    • 调试程序的重要方法
  • 具体使用1:单行注释、多行注释

    • 对于单行和多行注释,被注释的文字,不会出现在字节码文件中,也就不会被 JVMjava 虚拟机)解释执行

    • 多行注释里面不允许有多行注释嵌套

    • 一个段子

      java
      A:嘿 //是什么意思啊?
      B:嘿.
      A:呃 我问你//是什么意思?
      B:问吧.
      A:我刚才不是问了么?
      B:啊?
      A:你再看看记录...
      B:看完了.
      A:......所以//是啥?
      B:所以什么?
      A:你存心耍我呢吧?
      B:没有啊 你想问什么?
      ……
      不断循环之后,A一气之下和B绝交,自己苦学程序。
      N年之后,A终于修成正果,回想起B,又把聊天记录翻出来看,这时,他突然发现B没有耍他……
      而他自己也不知道当年他问B的究竟是什么问题……
  • 具体使用2:文档注释(Java特有)

    • 文档注释内容可以被 JDK 提供的工具 javadoc 所解析生成一套以网页文件形式体现的该程序的说明文档

    • 操作方式,如:

      shell
      javadoc -d mydoc -author -version HelloWorld.java

      image-20240507004335523

  • 案例:

    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 文档

十四. 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 程序在该系统中的运行。
JVM的跨平台性

image-20211217111217831

  • 面向对象性:
  • 面向对象是一种程序设计技术,非常适合大型软件的设计和开发。面向对象编程支持封装、继承、多态等特性,让程序更好达到高内聚,低耦合的标准
  • 健壮性:

    • 吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
  • 安全性高:

    • Java 适合于网络/分布式环境,需要提供一个安全机制以防恶意代码的攻击
    • 如:安全防范机制ClassLoader 类加载器),可以分配不同的命名空间以防替代本地的同名类、字节代码检查
  • 简单性:

    • Java 就是 C++语法的简化版,我们也可以将 Java 称之为“C++--
    • 比如:头文件,指针运算,结构,联合,操作符重载,虚基类等
  • 高性能:

    • Java 最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免
    • Java 语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过 JIT(JUST IN TIME) 即时编译技术提高运行效率
      • JIT热点代码编译成机器代码,后续使用直接使用之前编译后的机器代码
    • Java 低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多 C++ 应用转到 Java 开发,很多 C++ 程序员转型为 Java 程序员

缺点

  • 语法过于复杂、严谨,对程序员的约束比较多,与 pythonphp 等相比入门较难。但是一旦学会了,就业岗位需求量大,而且薪资待遇节节攀升
  • 一般适用于大型网站开发,整个架构会比较重,对于初创公司开发和维护人员的成本比较高(即薪资高),选择用 Java 语言开发网站或应用系统的需要一定的经济实力
  • 并非适用于所有领域。比如,Objective CSwiftiOS 设备上就有着无可取代的地位。浏览器中的处理几乎完全由 JS 掌控。Windows 程序通常都用 C++C# 编写。Java 在服务器端编程和跨平台客户端应用领域则很有优势

02. JVM 功能说明

  • JVM(Java Virtual Machine ,Java虚拟机):是一个虚拟的计算机,是 Java 程序的运行环境

  • JVM 具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器

    image-20220310165805739

功能一:实现 Java 程序的跨平台性

  • 我们编写的 Java 代码,都运行在 JVM 之上,正是因为有了 JVM,才使得 Java 程序具备了跨平台性

    image-20220513191856727
  • 使用 JVM 前后对比:

    image-20220514151716805

功能二:自动内存管理(内存分配、内存回收)

  • Java 程序在运行过程中,涉及到运算的数据的分配、存储等都由 JVM 来完成
  • Java 消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间
  • GC 的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏
  • 内存溢出:内存超出内存最大容量
  • 内存泄露:无用的内存占用

十五. 章节案例


  • 案例1:个人信息输出

    image-20231206230740815
    java
    class Exercise1{
    	public static void main(String[] args){
    		System.out.println("姓名:康师傅");
    		System.out.println("性别:男");
    		System.out.println("家庭住址:北京程序员聚集地:回龙观");
    	}
    }
  • 案例2:输出:心形

    • 结合 \n(换行newline),\t(制表符tab),空格等在控制台打印出如下图所示的效果

      image-20231206231308725
  • 方式一:

    java
    public 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("*");
      }
    }
  • 方式二:

    java
    public 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是一门半编译半解释型的语音

image-20240601220914436

字节码编译到机器码的过程:部分代码走解释器解释执行,部分热点代码走JIT编译器编译执行。

Released under the MIT License.