第一章 走进Java

一、什么是JAVA?

简而概之:java是一种跨平台的面向对象的编程语言。这里要分为Java语法,跨平台,面向对象三部分来解释

  • Java语法,语法就是和其他的编程语言差不多,诸如定义变量,操作赋值,数学运算,流程控制等等。

  • 跨平台,所谓跨平台是指用java语言编写的代码,可以在其他各种不同操作系统或者硬件上运行。相对的是C,汇编这种语言而说的,因为C,汇编语言如果要从A系统(windows)迁移到Unix/Linux/Mac等系统,代码并不能百分百的成功,可能迁移之后就会报错,需要修改代码以适应新的操作系统或者硬件环境。而java因为不是直接和操作系统以及硬件打交道,而是使用C语言主要语言为每种不同的操作系统或者硬件编写了一个软件(JVM),而java语言编写的代码就是运行在这个软件(JVM)上,所以才可以"一次编译,到处运行"(Compile once, run everywhere)。

  • 面向对象,面向对象的核心思想就是世间万物都是对象,你要把所有的事物都看作是一个对象,然后这些你认为的对象再组合起来成为另一个对象,把这个组合起来的对象看为一个大的对象,往复循环,周而复始。一花一世界,一叶一对象。一朵花就像一个世界一样,花的每一片叶子都是一个对象,一朵花就是由这一片片叶子组成。把这种思想运用到java开发中去,一花一世界是抽象的理解,是宏观的概括。一叶一对象是微观的拆分,是编程的细节。微观组成整体,细节成就程序。

二、JAVA的组成部分(java的技术体系)

Sun官方所定义的Java 技术体系包括以下几部分组成:

  • Java 程序设计语言

  • 各种硬件平台上的Java虚拟机(JVM)

  • Class文件格式

  • Java API 类库

  • 来自商业机构和开源社区的第三方Java类库

我们可以把Java 程序设计语言,Java虚拟机(JVM),Java API 类库分统称为JDK,JDK是用于支持Java程序开发的最小环境。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vzFZ2oC-1683874457780)(https://note.youdao.com/yws/res/2154/831AA209C28A4CFA8914CF89D0F891D8)]

Java技术体系可以分为4个平台,分别为:

  • Java Card: 支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。

  • Java ME(Micro Editiion): 支持Java程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,并加入了对移动终端的支持,这个版本以前称为J2ME。

  • Java SE(Standard Edition): 支持面向桌面应用(如Windows程序)的Java平台,提供了完整的Java API,这个版本以前称之为J2SE。

  • Java EE(Enterprise Edition): 支持使用多层架构的企业应用(如ERP,CRM应用)的Java平台,除了提供Java SE API 外,还对其做了大量的扩充并提供了相应的部署支持,这个版本以前称为J2EE。

以上从名称上就可以看出,从小到大,可以说是面面俱到。

三、Java发展史

1991年4月,James Gosling博士领导的绿色计划(Green Project)启动Oak(java语言前身)并最终找准市场蜕变为Java语言。

1995年5月23日,Oak改名为Java,提出“Write Once,Run Anywhere”口号。

1996年1月23日,JDK1.0发布,第一个正式版本的运行环境。

1996年5月底,Sun在美国旧金山举行首届JavaOne大会。

1997年2月19 日,Sun公司发布JDK1.1。

1999年4月8日,JDK1.1一共发布了1.1.0~1.1.8九个版本,从1.1.4后每个版本都有一个工程代号。

1998年12月4日,里程碑版本JDK1.2,工程代号Playground(竞技场)。

1999年4月27日,HotSpot虚拟机发布。(1997年Sun公司收购HotSpot于Technologies的小公司)。

2000年5月8日,JDK1.3发布,工程代号Kestrel(美洲红隼)。

20002年2月13日,JDK1.4发布,工程代号Merlin(灰背隼)。

2002年,.NET Framework发布了。

2004年9月30日,JDK1.5发布,工程代号Tiger(老虎)。

2006年12月11日,JDK1.6发布,工程代号Mustang(野马)。终结了从1.2开始8年历史的J2EE,J2SE, J2ME的命名方式。启动Java SE 6,Java ME 6,Java EE 6的命名方式。

2006年11月13日,JavaOne大会上,Sun公司宣布Java最终会开源。

2009年2月19,JDK1.7完成了第一个里程碑版本,工程代号Dolphin(海豚)。

2009年4月20日,Oracle公司宣布正式以74亿美元收购Sun公司。Oracle公司还收购了BEA公司,取得了三大商业虚拟机的其中两个,JRockit和HotSpot。

2014年3月18日,Java SE 8.0 / 1.8,工程代号Spider(蜘蛛)。

2017年9月21日,Java SE 9.0 / 1.9 。

2018年3月21日,Java SE 10.0 / 10.0。

2019年3月19日,JDK12发布。

2019年9月17日,JDK13发布。

2020年3月17日,JDK14发布。

2020年9月15日,JDK15发布。

2021年3月16日,JDK16发布。

2021年9月,JDK17发布。(长期维护版本 - LTS)

虚拟机有很多,有兴趣的话可以了解下其他的虚拟机。

推荐阅读《深入理解Java虚拟机》周志明著。这本书讲的很详细,后悔没有早点读到这本书。

JDK各版本主要特性

  • JDK1.2

    • 改进集合框架,如新增HashMap替代旧的HashTable(常用)
    • 开始提供JIT(Just In Time)编译器;
  • JDK1.3

    • Dynamic Proxy: 加入了JDK动态代理(常用)
  • JDK1.4

    • NIO: 在传统BIO的基础上引入了NIO(Non-Blocking IO)(常用)。
  • JDK5 里程碑版本,大部分人也是从该版本开始接触Java。引入了很多意义深远的特性,如下:

    • 自动拆箱/装箱(Auto Inbox/Outbox)(常用)
    • 枚举(Enum)(常用)
    • 静态导入 (static import)
    • 可变参数列表 (var args)(常用)
    • 范型(Generic)(常用)
    • 增强for循环(for-each)(常用)
    • 注解(Annotation)(常用)
    • 协变返回类型:实际返回类型可以是要求返回类型的一个子类
    • concurrent并发包(Doug leg)(常用)
  • JDK6(2006-12, LTS)

    • Compiler API,可以实现动态编译Java源文件,如jsp编译引擎就是动态的,修改后无需重启服务器
    • 对脚本语言的支持:如js, ruby,groovy

注:因JDK6至JDK7中间间隔了足足5年,所以这个版本是个经典版本,很稳定,官方长期维护,使用了很长时间。

  • JDK7(LTS JDK7版本从JDK6后5年才发布,原因是中间经历了Sun公司被收购)

    • 特性一:一组小的改进
      1)Switch支持String(常用)
      2)try … with … resource(常用)
      3)范型类型自动推断(常用)
      4)多重catch(常用)
      5)数字可用下划线分割

    • 特性二:G1垃圾回收器(Grabage-First Collector)(常用)
      新出的垃圾回收器,用来替代Concurrent Mark-Sweep Collector(CMS)。目标是减少 Full GC 带来的暂停次数,增加吞吐量。

    • 特性三:concurrent包改进(常用)Doug Lea在此版本引入了轻量级的fork/join框架来支持多核多线程的并发计算。此外,实现了 Phaser 类,它类似于 CyclicBarrier 和 CountDownLatch 但更灵活。最后,ThreadLocalRandom 类提供了线程安全的伪随机数生成器。

    • 特性四:IO与网络的更新NIO2 主要包括了 3 个方面的改进:

      • 新的文件系统 API 支持大量文件属性的访问、文件系统监控服务、平台相关的 API,如 DosFileAttributes 和 PosixFileAttributes 等,以及一个可插拔文件系统的 SPI。
      • Socket 和文件的异步 IO。
      • Socket channel 的功能完善,支持 binding、多播等。
    • 特性五:JDBC更新(常用)

      • 支持JDBC4.1和Rowset 1.1
  • JDK8

    • 接口默认方法(常用)即接口中可以声明一个非抽象的方法作为默认的实现,方法的返回类型前要加上“default”关键字
    • lambda表达式(常用)
    • 函数式接口(常用)指仅仅包含一个抽象方法的接口需要标记@FunctionalInterface
    • 使用 :: 来传递方法引用,是lambda的简写(常用)
    • Stream API(常用)
    • 新的日期工具类(常用)
  • JDK9

    • 模块化 即只加载应用运行需要的模块
    • 改进的Java doc 生成的Java doc符合H5标准,支持API搜索
    • 集合工厂方法,优化集合初始化(常用)
        Set<Integer> ints = Set.of(1,2,3);
        List<String> strings = List.of("first","second"); 
    
    • 改进 Stream API
        IntStream.iterate(1, i -> i < 100, i -> i + 1).forEach(System.out::println);
    
    • 支持私有接口方法
    • HTTP/2(常用, 是预览版)
      新的方式处理HTTP调用,用于替换 HttpURLConnection,并提供对WebSocket和HTTP/2的支持
    • 多版本兼容
  • JDK10

    • 局部变量类型推断
    • 并行full gc的G1
    • 基于实验Java的JIT编译器
    • 增加一些实用API(常用)
    • HttpClient增强
    • ZGC(实验性质的垃圾收集器,目标是GC暂停时间不会超过10ms,既能处理几百兆的小堆,也能处理几个T的大堆。)
    • 完全支持Linux容器(JDK10开始,JVM可以识别当前是否在容器中运行,能接受容器设置的内存限制和CPU限制。)
    • Switch Expression
      • 传统使用switch的方式:
      switch (day) {case MONDAY:case FRIDAY:case SUNDAY:System.out.println(6);break;
      case TUESDAY:System.out.println(7);break;
      case THURSDAY:
      case SATURDAY:System.out.println(8);break;
      case WEDNESDAY:System.out.println(9);break;
      }
      
      • 如今可简化为:
      switch (day) {
      case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
      case TUESDAY -> System.out.println(7);
      case THURSDAY, SATURDAY -> System.out.println(8);
      case WEDNESDAY -> System.out.println(9);
      }
      
  • JDK13

    • 字符串拼接
    • 重写实现旧版套接字API
  • JDK14

    • switch优化变为最终版
    • gc相关
      • 删除CMS
      • 弃用 ParallelScavenge + SerialOld GC 的垃圾回收算法组合
      • 将 zgc 垃圾回收器移植到 macOS 和 windows 平台
    • instanceof 扩展 (preview)
        if (o instanceof String s) {System.out.println(s.length);}
    
    • 有帮助的NullPointerException
  • JDK15

    • RMI Activation被标记为Deprecate,将会在未来的版本中删除(JDK17)。
       RMI大家应该都清楚,RMI就是Remote Method Invocation,翻译成中文就是远程方法调用,是在JDK1.2中引入的。RMI为java提供了开发分布式系统的强大能力。而J2EE的规范EJB就是使用RMI来实现的bean的远程调用的。在RMI系统中,远程系统中存在很多分布式对象,如果这些分布式对象一直处于活动状态的话,将会占用很多宝贵的系统资源。于是RMI引入了一种lazy Activation的方式,这种方式就叫做延迟激活。对于现代应用程序来说,分布式系统大部分都是基于Web的,web服务器已经解决了穿越防火墙,过滤请求,身份验证和安全性的问题,并且也提供了很多延迟加载的技术。所以在现代应用程序中,RMI Activation已经很少被使用到了。并且在各种开源的代码库中,也基本上找不到RMI Activation的使用代码了。为了减少RMI Activation的维护成本,在JDK8中,RMI Activation被置为可选的。现在在JDK15中,终于可以废弃了。
      
    • 实现了EdDSA椭圆曲线签名算法(MD5,SHA-256,RSA)
    • 引入了Record类型,解决定义大量get/set方法的问题,可一定程度替代掉lomobok
          public record Address(String addressName,String city) {}
          public record CustUser(String firstName,String lastName,Address address,int age) {}
      
      • Record和普通的类的区别就在于Record多了一个括号括起来的定义的字段。
      • Record类默认是final的,里面的字段默认是private final的。
  • JDK16

    • instanceof 增强确定为最终版本,该功能已经在JDK14初次引入。
    • Records确定为最终版本,该功能同样也已经历了两代预览版。
    • 弹性Metaspace功能可将未使用的HotSpot虚拟机的Class Metadata(Metaspace)占用的内存更迅速的返回给操作系统,从而减少Metaspace的占用并简化Metaspace的代码以降低维护成本
    • 将JDK移植到Windows/AArch64平台。
    • 提供用于打包独立的Java应用程序的jpackage工具。
  • JDK17(LTS)

JDK 17 will be a long-term support (LTS) release from most vendors. For a complete list of the JEPs integrated since the previous LTS release, JDK 11, please see here.

JEP描述
306Restore Always-Strict Floating-Point Semantics
356Enhanced Pseudo-Random Number Generators
382New macOS Rendering Pipeline
391macOS/AArch64 Port
398Deprecate the Applet API for Removal
403Strongly Encapsulate JDK Internals
406Pattern Matching for switch (Preview)
407Remove RMI Activation
409Sealed Classes
410Remove the Experimental AOT and JIT Compiler
411Deprecate the Security Manager for Removal
412Foreign Function & Memory API (Incubator)
414Vector API (Second Incubator)
415Context-Specific Deserialization Filters

    • JDK 内部的强封装,除了sun.misc.Unsafe等关键的内部 API 外,用户将不再可能通过单个命令行选项来 relax 对内部元素的强封装,这在 JDK 9 到 JDK 16 中是可行的。该计划的目标包括提高 JDK 的安全性和可维护性,并鼓励开发人员从内部元素迁移到标准 API。

    • 删除远程方法调用 (RMI) 激活机制,同时保留 RMI 的其余部分。RMI 激活机制已过时和废弃,在 JDK 15 中不推荐使用(可参考上文JDK15部分的描述)。

    • 删除实验性 AOT 和 JIT 编译器,它们几乎没有使用,但需要大量维护工作。该计划要求维护 Java 级别的 JVM 编译器接口,以便开发人员可以继续使用外部构建的编译器版本进行 JIT 编译。

    • 将 JDK 移植到 MacOS/AArch64 以响应 Apple 将其 Macintosh 计算机从 x64 转换到 AArch64 的计划(Apple M1处理器)。针对 MacOS/AArch64 的更改有可能破坏现有的 Linux/AArch64、Windows/AArch64 和 MacOS/x64 port,但这种风险可通过预集成测试来降低。

    • 弃用 Applet API 以进行删除。这个 API 本质上是无关紧要的,因为所有 Web 浏览器供应商要么已经取消了对 Java 浏览器插件的支持,要么已经宣布了这样做的计划。Applet API 之前在 2017 年 9 月的 Java 9 中已被弃用,但并未删除。Applet API彻底被删除,最早java就是靠applet开始火的。

    • 弃用 Security Manager,准备在未来版本中移除。追溯到 Java 1.0,Security Manager 一直是保护客户端 Java 代码的主要手段,很少用于保护服务器端代码。该提案的一个目标是评估是否需要新的 API 或机制来解决使用 Security Manager 的特定狭窄用例,例如阻塞System::exit。计划要求弃用 Security Manager 以与旧 Applet API 一起删除,该 API 也计划在 JDK 17 中弃用。

总体来说JDK17没有在语言层面有新的改进。

  • JDK18
JEP描述
JEP 400默认为 UTF-8(opens new window)
JEP 408简单的网络服务器(opens new window)
JEP 413Java API 文档中的代码片段(opens new window)
JEP 416使用方法句柄重新实现核心反射(opens new window)
JEP 417Vector API(三次孵化)(opens new window)
JEP 418互联网地址解析 SPI(opens new window)
JEP 419Foreign Function & Memory API (二次孵化)(opens new window)
JEP 420switch 模式匹配(二次预览)(opens new window)
JEP 421弃用完成删除(opens new window)
  • JDK 19
    从 JDK 19 的概述页面来看,JDK 19 处于 Rampdown Phase Two 阶段,整个功能集已被冻结,将不再对 JEP 进行改动。

Java 19 只有 7 个新特性:

JEP描述
405Record Patterns (Preview) 记录模式
422Linux/RISC-V Port Linux/RISC-V 移植
424Foreign Function & Memory API (Preview) 外部函数和内存 API
425Virtual Threads (Preview) 虚拟线程
426Vector API (Fourth Incubator) 向量 API
427Pattern Matching for switch (Third Preview) Switch 模式匹配
428Structured Concurrency (Incubator) 结构化并发
  • JDK20
    搬运下官方的文档https://openjdk.org/projects/jdk/20/,如果要看其他版本的JDK文档,只需要改变最后的20为对应的版本号即可。对于英文不好的我,谷歌翻一下还是可以的。这里我就不翻译了

This release is the Reference Implementation of version 20 of the Java SE Platform, as specified by JSR 395 in the Java Community Process.

JDK 20 reached General Availability on 21 March 2023. Production-ready binaries under the GPL are available from Oracle; binaries from other vendors will follow shortly.

The features and schedule of this release were proposed and tracked via the JEP Process, as amended by the JEP 2.0 proposal. The release was produced using the JDK Release Process (JEP 3).

JEP描述
429Scoped Values (Incubator)
432Record Patterns (Second Preview)
433Pattern Matching for switch (Fourth Preview)
434Foreign Function & Memory API (Second Preview)
436Virtual Threads (Second Preview)
437Structured Concurrency (Second Incubator)
438Vector API (Fifth Incubator)
  • JDK 21

这个版本将是Java SE平台21版的参考实现,正如JSR 396在Java Community Process中所指定的那样。

21版本的目标特性如下:

JEP描述
404Generational Shenandoah (Experimental)
439Generational ZGC
440Record Patterns
441Pattern Matching for switch
443Unnamed Patterns and Variables (Preview)
445Unnamed Classes and Instance Main Methods (Preview)
448Vector API (Sixth Incubator)

自从Oracle 收购Sun公司 JDK 后 ,承诺6个月发布一个JDK版本,到如今版本发布稳如老狗,如果没有一颗坚持终身学习心话,建议不要入行程序员,特别是不要学Java。
因为你会发现你的学习曲线是抛物线,总有一个顶点。但是技术的发展却永无止境。终有一天你会跟不上应用技术发展的脚步,而被淘汰,被迫改行,这时候你会更痛苦。所以还不如趁早转行,或者干脆不要进入这个行业,以此谋生,少走20弯路。应用技术的能力经验的积累以及社会地位相比于医生,律师,教师,公务员,军人等职业对于普通人来说,时间越长你越发会觉得走错了路,特别是被社会抛弃的时候。

结尾

纵观我的学习路线,Java语法->Java API->Spring Framework->Mybatis->Hibernate->数据结构->JVM。

学完上面的之后,再来学习现在流行的最常用的微服务框架SpringBoot->SpringCloud。

蹉跎了好几年,后悔没早学到本质。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐·王惜之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值