• 初识Java


    概述

    该节主要了解一下Java的非代码层面的基本知识和概念,只需要留个印象就可以了!

    本小节没有重点知识,但是作为Java程序员,对诸如Java历史之类的内容应该尽量了解一些!

    建议将该小节作为故事了解,读一读基本就可以了!

    Java历史

    “以史为镜,可以知兴替”——从Java的发展中,完全可以感受出什么是** “浪潮” **」

    诞生

    Java语言的开发起点和诞生可以追溯到1991年,在当时,Sun公司为了在家电产品(比如电视机顶盒)上实现嵌入式的应用,成立了一个名为 GREEN 的小组,由 詹姆斯·高斯林(James Gosling )等人牵头,开发出了一款名为Oak的开发语言,这就是Java的前身。

    [-] 关于Oak语言

    Oak语言在设计开发之初,Sun公司研发人员就没有将它定义为一个新型语言。

    而是根据嵌入式软件的要求,对C++进行了改造:

    去除了留在C++的一些不太实用及影响安全的成分,并结合嵌入式系统的实时性要求,开发了Oak语言。(Oak,橡树,大概是Sun公司门口有这种树,所以起了这个名字)

    Oak语言由于种种原因,并没有真正应用于市场,最终也只是实验室中的一个试验品。

    但是它作为Java的前身,给Java语言的开发奠定了基调,也就是以后Java具有的两个重要特性:


    #特性1#(blue) 简单性,简化C++而来

    #特性2#(blue) 跨平台性

    这两个特性将是Java在设计开发、面世之初,最为重要的特性。

    虽然Oak没有在嵌入式领域取得成功,但机会总是馈赠有准备的人。1995年,互联网的蓬勃发展给了Oak新的机会,业界为了使死板的、单调的静态网页能够灵活起来,急需一种新的软件技术来开发一种动态的、能够跨平台运行并且能够在网络上传播的程序。

    在当时,包括微软、IBM等一系列后来的互联网巨头公司纷纷下场,都投入了大量资金进行相关研发。而这个时候,Sun公司想起了那个被搁置起来很久的Oak,并且重新审视了那个用软件编写的试验平台。

    除了具有上述两个特性外,由于它是按照嵌入式系统硬件平台体系结构进行编写的,所以非常小,特别适用于网络上的传输系统(早期互联网带宽很低,太大的应用肯定加载不出来)。

    正是由于已经有现成的、较为成熟的技术可以直接参考,所以Sun公司率先推出了可以嵌入网页,并且可以随同网页在网络上跨平台传输的 Applet应用

    [-] 关于Applet

    Applet是一种将小程序嵌入到网页中进行执行的技术,采用Java语言编写的Applet,可以包含在 HTML 页面中,有点类似于网页中包含的图片。含有Applet的网页的HTML文件代码中部带有这样一对标记。当支持Java的网络浏览器遇到这对标记时,就将下载相应的小应用程序代码并在本地计算机上执行该Applet。

    >(red!)

    随后Sun公司将Oak更名为Java,并在1995年的5月23日,于当年的Sun World会议上正式发布Java和HotJava浏览器,这一天实际上可以认为是Java的诞生日。虽然严格来说,Java不是某个人开发出来的,但是普遍认定詹姆斯·高斯林是Java之父,也有人喜欢叫他高司令。(当然任何大型软件都不可能是单人开发的,xxx之父只是一个纪念意义。)

    詹姆斯·高斯林图

    上图就是高斯林本尊了,很符合心中对程序员的刻板印象吧(😀

    [-] 关于Java的改名

    Oak作为Java的前身,之所以被改名Java是因为:

    Sun公司在申请商标时发现Oak已经被人使用了(可怜的橡树错过了扬名天下的机会)。

    最终使用了参会者在喝一杯Java(爪哇岛产)咖啡时无意提到的Java单词作为了商标和名称。(Java在英文中的原意是印度尼西亚的爪哇岛,以盛产咖啡而闻名)

    在Java语言流行火爆后,现在更常用jawa指代爪哇岛。

    发展

    Java自诞生后,很快就站在了历史舞台的中央。Applet 一经发布就全面占领市场,其它互联网企业纷纷放弃自研产品,转而让自家产品去兼容Applet,Java迎来了高速发展时期。 总得来说,Java大概经历以下发展历程:

    1. 1995年5月23日,在SunWorld大会上,Java诞生,并首次提出了著名的Write Once,Run Anywhere口号(也就是跨平台性)。

    2. 1996年1月,JDK 1.0发布,Java语言有了第一个正式版本的运行环境。

      • 代表技术包括 Java 虚拟机(Sun Classic VM)、Applet、AWT 等。
    3. 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入 Java 技术。

    4. 1996年5月,Sun公司在旧金山召开了首届JavaOne大会,JavaOne是全世界Java程序员一年一度的交流盛会。

    5. 1996年9月,已有大约 8.3 万个网页应用了 Java 技术来制作。

    6. 1997年2月,JDK 1.1发布,Java语法有了一定的发展。

      • 代表语法是内部类,反射,JDBC等。
    7. 1998年12月,Java迎来了革命性的1.2版本,Sun公司将Java技术体系拆分为了三个方向:

      1. 面向桌面应用开发的 J2SE(Java 2 Platform,Standard Edition)
    8. 面向企业级开发的 J2EE(Java 2 Platform,Enterprise Edition)

    9. 面向手机等移动终端开发的 J2ME(Java 2 Platform,Micro Edition)

    JDK 1.2的代表技术是集合(Collection)、JIT(Just In Time) 编译器。

    1. 2000年5月,JDK 1.3版本发布,主要改进是升级了Java虚拟机(HotSpot VM),极大提升了Java执行效率。

    >(green!)

    [-] 关于HotSpot VM

    虽然听起来没有多么重要,但是HotSpot VM的加入无疑是Java诞生以来最重要的升级。

    这极大得解决了一直以来Java被诟病的“效率”问题。

    Java的执行效率虽然还是不及C++,但也已经没有特别大的差距了。效率的提升,极大扩宽了Java的使用场景。

    >(green!)

    1. 2002年2月,JDK 1.4版本发布,1.4版本是Java真正走向商业成熟的一个版本。

      • Java 1.4的代表技术是链式异常处理,正则表达式,日志类等。

      直到现在,仍然有些老项目可以运行在JDK 1.4上的(当然这很少见)

    2. 2002年同年,微软(Microsoft)公司发布了Java的竞品语言 C# 以及 .net 平台,极大的影响了Java的发展。

    >(green!)

    [-] 关于C#

    微软的C#和.net平台发布后,两者开始了为期十几年的暗自竞争。从语言特性上来说,C#几乎可以认为是基于Java改进的语言(对,你改进C++,我改进你)它的语法比Java更简洁,很多地方也比Java更严谨。并且C#和.net依赖于Windows操作系统的强大背书,可以称之为Windows的神以至于后发先至而渐渐处于优势。

    但 Java 依赖良好的开发者生态,在大型软件公司的众多开发者的不断贡献下,以及对 Linux 操作系统良好的支持,渐渐的在服务器端获得优势地位。(也就是今天的JavaEE)

    >(green!)

    1. 2004年9月,JDK 5.0版本发布,Sun公司摒弃了以往1.X的命名规则,转而直接升级大版本号。
      • JDK 5.0版本的代表技术是泛型,自动装箱,注解,枚举,可变参数,增强for等。

    >(green!)

    [-] 关于命名的更改

    在Java5之前,Java版本的命名一直都是1.X的形式。

    命名版本号的更改,按照开发者的原话是:1.5版本的改进是如此的大,以至于我们想用5.0称呼它!

    这当然是有道理的,JDK5.0的升级对 Java 语言的推动是非常巨大的,特别是注解的加入,使得语言定义灵活了很多,程序员可以写出更加符合领域定义的描述性程序。直到如今,注解也是日常开发Java程序员最常用的语言特性之一!

    除此之外,这个改动业界也普通认为Sun公司是受了微软**.net**的影响:

    因为.net发布没两年,就很快将自己的版本号从 1.X 升级到了 2.X,反观Java发布近十年,仍然徘徊在 1.X ,不得不说这个版本号命名确实有点保守了。

    >(green!)

    1. 2006年11月,Sun公司由于经营不善,濒临倒闭,于是在当年的JavaOne大会上宣布开源Java。

    2. 2006年12月,Java SE 6 仍如期发布。这一次Sun公司删除了版本号中的".0",重新命名Java技术体系的三个方向:

      1. 面向桌面应用开发的 Java SE(Java Standard Edition)
      2. 面向企业级开发的 Java EE(Java Enterprise Edition)
      3. 面向手机等移动终端开发的 Java ME(Java Micro Edition)

      Java 6是Sun公司发布的最后一个Java版本,实际上没多大改变,主要改进是提供了脚本支持,优化了性能等。

      SE/ME/EE的命名规则被延续至今。

    3. 2009年4月,甲骨文(Oracle)公司收购Sun公司,一度辉煌市值超千亿美元的Sun公司湮灭在历史的尘埃中。

    >(green!)

    [-] 关于Sun公司

    Sun公司的兴衰发展正如小米科技的创始人雷军说的:"站在风口上, 猪都能飞起来"那样,生于时代,终结于时代。时代和社会环境对任何人的影响都是非常大的,原腾讯副总裁吴军博士在他著书《浪潮之巅》中写到:"科技的发展不是均匀的,而是以浪潮的形式出现。每一个人都应该看清楚浪潮,赶上浪潮,如此便不枉此生。"这里强烈推荐吴军博士的《浪潮之巅》这本书,该书讲解了世界上巨头互联网公司(诸如IBM、Apple、微软等)的兴衰历史。即便将它当成故事书一样去看,也是十分精彩的,值得一看~

    吴军博士所著浪潮之巅,故事精彩,语言诙谐,可称为计算机行业的入门必读书籍。

    浪潮之巅-书籍

    >(green!)

    1. 2011年7月,Oracle公司发布Java SE 7,这是Oracle公司发布的第一个Java版本,发布了一系列新特性,包括:
      1. switch 语句块中允许以字符串作为分支条件。
      2. null 值的自动处理。
      3. 最主要的特性是 NIO2 和 Fork/Join 并发包,Java 虚拟机的稳定性真正做到的工业级。
    2. 2014年3月,Java SE 8发布,这是Oracle公司发布的第一个重要Java版本,是目前主流商用Java版本!
      • 主要特性有: Lambda 表达式、函数式编程、Stream API、新的时间类型等。
    3. 2017 年 8 月,甲骨文宣布要将 Java EE 转移到开源阵营。一个月后,Oracle 将 Java EE 转移到 Eclipse 基金会,随后Java EE被更名为"Jakarta EE",所以实际上Java的企业版现在已经不叫Java EE了(当然习惯这东西是难改的,习惯上仍叫Java EE)。
    4. 2017年9月,Java SE 9发布。同时Oracle 宣布,为了更快地迭代,以及跟进社区反馈,Java 的版本发布周期变更为每半年发布一个大版本,每个季度发布一个中间特性版本,并且承诺不会跳票。通过这样的方式,开发团队可以把一些关键特性尽早合并到 JDK 之中,以快速得到开发者反馈。按照官方的说法,新的发布周期会严格遵循时间点,将于每年的3月份和9月份发布。当然这么快发布的JDK并不会让Java开发者焦头烂额的学习,这是因为Oracle 只对 LTS(Long Term Support,LTS)版的 JDK 进行为期三年的的支持和更新,普通版的 JDK 只有短短六个月的生命周期。目前较近发布的JDK版本中,只有Java 8、Java 11以及Java 17是 LTS 版。

    >(green!)

    [-] 关于LTS版本和普通版本

    从Java 9开始,Java的版本可以分为LTS(Long Term Support,长期支持)版本和非LTS(过渡)版本两种。

    1. LTS长期支持版本指的是Oracle公司会从发行时期开始,较长的一段时间去支持并修复bug的版本,这段时间一般不会少于三年。长期支持版本意味着该版本稳定,bug较少,公司的生产环境中会优先选择长期支持版本。
    2. 非LTS(过渡)版本则意味着官方只会进行几个月的短期维护,过渡版本发布的目的是为了发布新特性让开发者了解。过渡版本不宜作为生产环境中使用。Oracle官方一般会在几个过渡版本中发布新特性让开发者了解,然后在随后LTS版本中集中修复bug,发布稳定版本。
    3. Java 8、Java 11、Java17是目前常见的三个LTS版本,其中Java 8 是生产环境中的主流。

    >(green!)

    1. 2018年3月,Java 10发布,是一个过渡版本。
    2. 2018年9月,Java 11发布,LTS版本。
    3. 2019年3月,Java 12发布,过渡版本。
    4. 2019年9月,Java 13发布,过渡版本。
    5. 2020年3月,Java 14发布,过渡版本。
    6. 2020年9月,Java 15发布,过渡版本。
    7. 2021年3月,Java 16发布,过渡版本。
    8. 2021年9月,Java 17发布,LTS版本。

    >(red!)

    最后,稍微解释解释一下为什么目前Java 8 是公司生产环境的主流:

    1. 首先第一个原因,它是一个LTS版本,并且已经发布很多年了,安全稳定,没有公司会去选择过渡版本或者较近发布的LTS版本,拿自己的产品做实验。
    2. Java 8 的Lambda表达式、Stream API等新特性非常好用。
    3. Spring Boot 家族框架从 2.0 版本开始仅支持Java 8以上版本
    4. 总结来说就是: Java 8 好用且够用,不需要升级引入可能的问题(可以预见Java 8 还会持续使用很多年)

    特点

    >(green!)

    Java语言的诞生和发展,可以说是应运而生并借着互联网的东风而兴起。作为一门编程语言它主要有以下特点:

    1. 简单性

    >(green!)

    [-] 和C++比较

    Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C++中很少使用的、很难理解的且令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换等。特别地,Java语言不使用指针,而是引用,更加安全。并提供了自动的垃圾回收机制(GC),使得程序员不必为内存管理而担忧。Java比起C++来说,要简洁和易用非常多,更容易学习使用。

    >(green!)

    1. 具有面向对象特性
    2. 健壮性

    >(green!)

    Java具有面向对象特性,这一点相信大家都很清楚,在后面的学习中,面向对象也将是我们最为重要的一个章节,后面再详谈它。

    Java的强类型、异常处理、垃圾的自动收集等机制是Java程序健壮性的重要保证。Java丢弃了指针,不仅让程序员写代码更容易,也提升了程序的健壮性。

    >(green!)

    1. 安全性
    2. 高性能

    >(green!)

    与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。(当然还是略有差距)

    >(green!)

    1. 编译和解释性

    >(cyan!)

    总之,Java作为一门优秀的面向对象设计语言:

    它沿袭了C/C++的很多语法和概念,但是又简化、优化和改进了很多地方,使得Java更简洁易学。它从诞生以来就是优等生,发展迅猛,在2000年左右就成为了学习和使用人数最多的编程语言之一。直至今天,Java依然是学习使用人数最多,相关就业岗位最多的编程开发语言。程序员的入门语言,选择Java一般不是一个错误的选择。

    Java主要用途

    >(green!)

    [-] 应用程序的架构问题

    要了解Java的主要用途,首先要明白应用程序的架构,在当前应用程序普遍有两种架构模式,即:

    1. C/S架构,即客户端/服务器端程序(Client/Server)架构。

      1. 这里的"客户端"可以是有 GUI (图形用户界面)的定制软件,也可以是浏览器,甚至可以是通过 SSH 访问服务器的命令行脚本等等。
      2. C/S架构实际上是一种定义非常宽泛的架构类型,很多人将它简单理解成"PC端的图形界面程序"是不正确的。
      3. 特别需要注意【C/S架构应用,不单单指GUI图形用户界面实现的,客户端程序】,它的定义是非常广泛的。
    2. B/S架构,即浏览器/服务器端程序(Brower/Server)

      1. 这里的浏览器就是我们常说的诸如IE、chrome、EDGE等应用软件。
      2. B/S架构的应用程序,需要借助浏览器来完成访问,实现功能。
      3. 常见的B/S架构的应用程序有:网站、APP等等**(广义来说APP也是浏览器)**
    3. 无论是B/S还是C/S架构的应用程序,它们都需要服务器端来存储、传输、运算数据,也需要服务器端来完成各种控制。

    其实了解它们的定义后,不难发现这两种架构的界限实际上已经很模糊了。或者说B/S架构本身就是C/S架构的一种特殊形式!

    Web 应用(JavaEE方向)

    >(green!)

    Web应用程序,顾名思义是一种可以通过Web(互联网)访问的应用程序。

    Web应用具备以下特点:

    1. 普遍采用B/S架构实现,用户只需要有浏览器即可访问使用,不需要再安装其他软件。
    2. Web应用当然也可以采用C/S架构实现。
    3. 但不管采用何种架构实现,都需要连接互联网才能使用,能够脱机使用的应用程序不是Web应用。

    我们日常生活中使用的大多数应用程序都是Web应用,比如各种管理系统,淘宝京东电商系统等。Web应用通过浏览器访问,必然需要服务端作出响应,而 Java是当前最常见、最主流的服务器端语言 ,使用Java做服务器端最大的优点是稳定,开发效率也很高(依赖于Java成熟的类库和框架体系)

    当然,目前Java最主流的用途也是作为服务器端开发语言。

    Android开发

    >(green!)

    在安卓刚问世并流行的201X年,使用Java进行安卓开发十分流行,并且工资相当可观。但如今来看,用Java做安卓开发早已式微,越来越少人使用Java开发Android,相关的工作岗位非常少。

    主要有以下原因:

    1. Google和Oracle公司有一定的纠纷,导致Google不愿意再在安卓中使用Java语言。
    2. 原生的安卓意味着公司还需要针对iOS等其它平台开发软件,增加成本,开发效率低。现在企业都倾向于使用使用Vue,H5这种可跨平台的开发语言。

    最后,可以了解一下的是,现在安卓开发使用一种类Java的语言的Kotlin 语言,它是JetBrains公司开发的(也就是开发IDEA的公司)

    桌面应用开发

    >(green!)

    狭义的桌面应用可以看成基于C/S架构的具有 GUI (图形用户界面)的定制软件,一般都是指PC端的桌面应用程序,不需要浏览器运行,而是直接运行在桌面操作系统上的应用,这意味桌面应用一般都可以单机使用,当然联网功能也完全可以具备。

    Java也是可以做桌面级应用开发的,但普遍来说,桌面应用开发是C/C++的天下。

    这是因为操作系统底层多是C语言开发的,使用C语言开发相关应用程序,实现功能可能会更加方便快捷,软件性能也会更加优越。

    Java在某些特殊情况下会有一些用武之地,比如开发一个需要频繁和Java语言交互的应用程序,但绝大多数情况下,用Java都不是一个好的选择。

    (没错,我们的开发工具IDEA就是依赖Java语言编写的)

    JDK和JRE

    >(green!)

    JRE(Java Runtime Environment):全称Java运行时环境。

    1. JRE包括Java虚拟机、运行时核心类库等Java程序运行时必备的环境。
    2. JRE主要是给已经编写好的Java程序使用,也就是说操作系统中想要运行Java程序,必须要有JRE。

    >(red!)

    JDK(Java Development Kit):Java开发者工具包

    1. JDK包含JRE。
    2. 除了JRE外,JDK还提供了Java开发者需要使用的工具,比如javac.exe,java.exe(Windows)

    Java程序的运行原理

    >(green!)

    以Windows操作系统为例:

    Java程序运行原理

    Java源代码总是要经过编译,得到class字节码文件,然后字节码文件在Java虚拟机中解释执行。

    Java语言的跨平台性

    >(green!)

    Write Once,Run Anywhere!

    Java语言曾经最引以为傲,最显著的特性就是Java的跨平台性 :指Java语言编写的应用程序,只需要写一次代码,就可以在不同的系统平台上正常运行。当然这个特性的实现,也并没有多少神奇的地方。Java实现跨平台性依赖于Java虚拟机(Java Virtual Machine,简称JVM)Java程序并不是直接执行在操作系统上的,而是执行在Java虚拟机中。正如上面运行原理中所看到的,字节码class文件最终都要在虚拟机中运行,只要每个操作系统都有自己的虚拟机实现,就可以完美实现跨平台性

    Java的跨平台性

    #小试牛刀|Java跨平台性 #(orange) >(orange!)

    Java可以跨平台吗?JVM可以跨平台吗?

    (答案当然是:可以、不可以)

    Java语言的编译性和解释性

    >(green!)

    [-] 编译执行和解释执行以及相关概念

    编译执行:通过编译器将源代码编译为机器码(机器能识别的代码指令),然后在机器上直接执行。

    解释执行:不需要编译成机器码,而是由解释器直接执行,并且一边解释一边逐句执行。

    做一个形象的比喻,假如说源代码是食材的话:

    1. 编译执行像炒菜吃,先把菜炒好再吃,炒菜的人相当于编译器的地位(源代码一次性全部编译,直接执行)
    2. 解释执行像吃火锅,一边煮一边吃,煮菜的人相当于解释器的地位(源代码一边解释,一边执行)

    明确上述编译执行和解释执行的概念后,我提出一个问题:萝卜一定要做火锅吃或者一定要炒着吃吗?

    一个萝卜,完全可以做火锅吃,也可以做炒菜吃,无论怎么吃都只是吃的一种方式罢了,看做菜的人什么心情就能吃什么。

    同样的, 源代码无论解释执行还是编译执行,都只是源代码的一种执行方式而已,到底怎么执行要看语言的具体设计。

    >(green!)

    在早期的编程技术书籍中,总是喜欢将编译后再执行的语言称之为编译型语言,与之相对的是解释型语言

    那么聪明的你,思考一下:Java到底是编译型语言还是解释型语言呢?

    很难回答吧,因为Java并不是那么“纯粹”的语言。

    实际上,编程技术发展到现在,用编译型、解释型这种上古时期"教科书"里的定义方式,来分类编程语言已经有点力不从心了,也不合时宜了。 语言的规范中一般只会定义其抽象语义,而不会强制性要求采用某种实现方式。

    很多资料会说,PythonRubyJavaScript都是"解释型语言",是通过解释器来解释执行的,但这不意味着它们不能编译后再执行,实际上只需要开发相应的编译器就可以了。

    再比如,很多人思想中根深蒂固的编译型语言:C语言,正常情况下,C语言代码确实是先编译再一次性执行的,但是它的解释器执行版本早就已经实现了。

    再回到问题本身,对于Java来说:

    其实说Java是解释型语言,或编译型语言都是不完全正确的,或者说最好不要用这种"过时的"定义来解释Java语言的特性。

    Java语言编写的程序在具体执行时,可以选择解释实现也可以选择编译实现。所谓的编译型和解释型并不是语言的特性,而是语言实现的特性。

    得出启示:

    1. 不要执拗于概念,很多概念随着时间和技术的发展,会变得不适用。

    2. **学习技术要多思考,不要人云亦云。**我们以后,会在浩如烟海的互联网技术论坛中学习与进步,一定要学会独立思考,甄别错误。

    Java开发工具

    >(green!)

    简要介绍一下,Java开发过程中,可能会使用到的一些工具。

    1. 记事本类
      1. Notepad :操作系统自动的记事本软件。
      2. Notepad++:相当流行的记事本软件,后来曝出作者是台独分子,已弃用。
      3. **Sublime Text **:目前比较流行的,取代 Notepad++ 的记事本软件。
    2. 集成开发环境(IDE,Integrated Development Environment
      1. Eclipse:一个开放源代码的、基于Java的可扩展的开发平台
        • Eclipse最大的优点就是开源免费,但是它功能并不完善。目前有些小城市的小公司可能会使用。
      2. MyEclipse:基于Eclipse开发,是一款曾经应用比较广泛的商业化软件,是收费软件。
      3. IntelliJ IDEA:JetBrains公司出品的,智能化的、功能齐全的商业化软件,是目前最主流的Java开发集成环境。

    当然,实际开发中,没有人会选择记事本类的开发工具。但也可以下载一下记事本软件,偶尔用来看看配置文件等。

    IntelliJ IDEA是我们以后学习和工作中最常使用的开发工具,请大家自行完成安装和熟悉使用。

    The End

  • 相关阅读:
    能进大厂?阿里云ACE认证到底有多香!
    第十五届蓝桥杯题解-数字接龙
    Springboot服装服装销售管理系统毕业设计-附源码221801
    安全进阶:SSH实验配置指导
    【MySQL】多表查询、子查询、自连接、合并查询详解,包含大量示例,包你会。
    圈复杂度检测
    SpringBoot-Druid
    面向电缆行业的高级计划与排程(商简SPS)解决方案
    【数据结构--排序】堆排序
    第2-3-5章 删除附件的接口开发-文件存储服务系统-nginx/fastDFS/minio/阿里云oss/七牛云oss
  • 原文地址:https://blog.csdn.net/gezongbo/article/details/127127672