likes
comments
collection
share

【Java学习之路】不讲武德的Spring < (-︿-)> 逼我掌握Java17 是吧 ?

作者站长头像
站长
· 阅读数 3

你变任你变,我用 Java 8

多年来,'你变任你变,我用 Java 8' 这句口号在业界广为流传。在我工作的这些年里,Java 8 仿佛已经成为一个不可或缺的终极版本。最近,我们公司新项目的架构设计都一致选择了 Java 8,这让我不禁好奇,为什么这么多企业都如此坚定地选择使用 Java 8 呢?

我自己一点浅薄的见解:

  1. Lambda 表达式和函数式编程:Java 8引入了Lambda表达式和函数式接口,使得编写函数式风格的代码变得更加简洁和易读。这为并发编程和事件驱动程序设计提供了更好的支持。
  2. Stream API:引入了Stream API,可以更容易地进行集合操作和数据处理,从而提高代码的简洁性和可读性。Stream API还提供了并行处理的能力,可以更高效地利用多核处理器,处理集合数据简直太香了。
  3. 新的日期和时间 API:Java 8提供了全新的日期和时间API(java.time包),解决了旧的Date和Calendar类存在的问题,使得日期和时间的处理更加简单和安全。
  4. 默认方法:在接口中引入了默认方法,使得接口的演进变得更加灵活,并且可以向现有的接口添加新的方法,而不会破坏现有的实现类。
  5. 并行数组操作:Java 8提供了新的并行数组操作,使得在多核处理器上进行数组操作更加高效。
  6. 更好的性能和安全性:Java 8引入了许多新的优化和改进,提高了Java程序的性能和安全性,使其更适合于大规模企业级应用程序的开发和部署。

所以Java 8 一直是市场的主流。

好你个Spring , 不讲武德,不让我用 Java 8 是吧

所以啊,我也就不怎么关注 Oracle 公司的 java的版本更替,因为还是一句话 "你变任你变,我用 Java 8"。

众所周知,"Java是Java,Spring 是 Spring 是两门语言"。但是一些新的需求是我不得不用 SpringBoot 3.0 以上的版本的时候,这么一创建项目才知道,好家伙,你小子什么时候只支持 Java 17了,我靠,我不用Java 17你不让我用Spring是吧,好好好,那这就不得不了解一下Java 17了,是什么让 Spring 你如此迷恋Java 17?

【Java学习之路】不讲武德的Spring < (-︿-)> 逼我掌握Java17  是吧 ?

所以我们来看看Java17到底比Java8提升在哪里?

一. 项目Loom和Fibers

Java 17引入了项目Loom,旨在通过引入轻量级的Fibers(或称为纤程)和协作式线程调度器来改善并发编程。这就使得Java能够更高效地处理大量线程,从而提高了并发编程的效率。

快速使用

1、创建一个 Fiber:

Thread fiber = Thread.startVirtualThread(() -> {
    // 在这里放置需要执行的代码
});

2、在 Fiber 中执行需要并发执行的任务:

fiber.execute(() -> {
    // 在 Fiber 中执行的任务
});

3、等待 Fiber 完成:

fiber.join();

4、一个完整例子

import java.lang.Thread;

public class Main {
    public static void main(String[] args) {
        Thread fiber = Thread.startVirtualThread(() -> {
            System.out.println("This is a lightweight fiber!");
        });
        fiber.join();
    }
}

特性优点

  1. 简化并发编程:开发人员可以编写类似于传统阻塞式 IO 的代码,而不需要使用回调或者异步编程模型。
  2. 减少线程开销:Fibers 是轻量级的用户级线程,可以在一个线程中并发执行,减少了线程创建和切换的开销。
  3. 提高性能和可伸缩性:通过减少线程开销和简化并发编程,可以提高应用程序的性能和可伸缩性。

二 .项目Panama

Java 17对Java本地接口(JNI)进行了改进,以更好地与本地代码交互。这些改进使得Java能够更轻松地集成本地代码,提高了Java在与其他语言交互方面的灵活性和性能。

Java 8 是如何调用C++ 的 可以参考我这篇文章。

快速使用

1、创建本地方法接口(Native Method Interface):在 Java 类中声明需要调用的本地方法,使用 native 关键字标识这些方法为本地方法。例如:

public class NativeIntegration {
    public native void callNativeMethod();
}

2、使用 javac 编译 Java 类:使用 javac 编译器编译包含本地方法接口的 Java 类,生成对应的 .class 文件。

3、使用 javah 生成头文件:使用 javah 工具生成包含本地方法声明的头文件。在命令行中进入包含生成的 .class 文件的目录,然后执行以下命令:

javah NativeIntegration

这将生成一个名为 NativeIntegration.h 的头文件,包含了本地方法的声明。

4、实现本地方法:在本地代码(例如 C 或 C++)中实现在头文件中声明的本地方法。例如,在 NativeIntegration.h 中声明的方法需要在本地代码中实现,例如:

#include <jni.h>
#include "NativeIntegration.h"

JNIEXPORT void JNICALL Java_NativeIntegration_callNativeMethod(JNIEnv *env, jobject obj) {
    // 实现本地方法的具体逻辑
}

5、编译本地代码:使用对应的编译器(如gcc)编译本地代码,生成对应的动态链接库(.so 文件或 .dll 文件)。

6、在 Java 中加载本地库:在 Java 类中使用 System.loadLibrary() 方法加载编译好的本地库。例如:

public class NativeIntegration {
    static {
        System.loadLibrary("NativeIntegration");
    }
    public native void callNativeMethod();
}

7、调用本地方法:在 Java 中调用本地方法。例如:

public class Main {
    public static void main(String[] args) {
        NativeIntegration nativeIntegration = new NativeIntegration();
        nativeIntegration.callNativeMethod(); // 调用本地方法
    }
}

特性优点

  1. 更简单的集成本地代码:Java 17 的改进使得与本地代码的集成更加简单,不再需要繁琐的手动内存管理和类型转换,减少了与本地代码交互时的复杂性。
  2. 提高灵活性:通过改进的 JNI 特性,Java 可以更灵活地与其他语言交互,包括 C、C++ 等本地代码,从而拓宽了 Java 应用程序的应用范围。
  3. 提高性能:改进后的 JNI 特性可以提高 Java 与本地代码交互的性能,减少了一些开销,使得 Java 应用程序能够更高效地调用本地代码,从而提升整体性能。
  4. 降低开发成本:通过简化与本地代码的集成,开发人员可以更快速地实现 Java 与本地代码的交互,减少了开发成本和时间。

三 .库的改进 Stream的新方法toList()

快速使用

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream<String> stream = Stream.of("Java", "is", "awesome");
        List<String> list = stream.collect(Collectors.toList());
        System.out.println(list); // 输出:[Java, is, awesome]
    }
}

四 .增强的安全性 密封类 和 允许类引入

// 定义一个密封类 Shape
public sealed class Shape {
    // ...
}

// 定义一个最终类 Circle,实现了 Shape 密封类
public final class Circle extends Shape {
    // ...
}

// 定义一个最终类 Rectangle,实现了 Shape 密封类
public final class Rectangle extends Shape {
    // ...
}

// 定义一个最终类 Triangle,实现了 Shape 密封类
public final class Triangle extends Shape {
    // ...
}

我们定义了一个密封类 Shape,然后实现了它的三个最终类:Circle、Rectangle 和 Triangle。通过sealed关键字,我们在Shape类中限定了允许的子类范围,这样就可以确保只有这三个类可以实现Shape类。

特性优点

  1. 类型安全:通过密封接口和允许的类列表,可以在编译时就限制了可以实现该接口的类的范围,提高了类型安全性。
  2. 易于扩展:密封接口可以在后续添加新的实现类,只需在 permits 子句中添加新的类名即可,而不需要修改原有代码。
  3. 易于维护:由于密封接口明确规定了允许实现的类列表,因此在维护代码时可以更容易地理解和管理类的关系。
  4. 更好的可读性和可维护性:通过 permits 关键字可以清晰地看出哪些类是允许实现该接口的,提高了代码的可读性和可维护性。
  5. 代码更加规范化:使用密封接口和允许类可以使代码更加规范化,有效地组织类的层次结构,提高了代码的结构化程度。

五 .垃圾回收器的改进

在垃圾回收器的改进方面,Java 17引入了新的垃圾回收器ZGC(Z Garbage Collector),可以提高大内存堆的性能和吞吐量。

快速使用

java -XX:+UseZGC MyApp

UseZGC表示启用Z Garbage Collector(ZGC)垃圾收集器。

ZGC是JDK 11中引入的一种低延迟、高吞吐量的垃圾收集器,适用于大内存和低延迟要求的场景。

Java17总结

总之 Java 17

  1. 增强的性能:对垃圾收集器、JIT 编译器和其他方面的性能进行了优化。
  2. 增强的安全性:改进的加密支持和安全算法。
  3. 增强的语言特性:新的语法、API 和工具。
  4. 增强的工具链:新的工具和改进。

我自己的看法。

  • 代码的优化说实话我觉得完全没必要搞得这么花里胡哨,对于程序员来说,多写两行代码,少些两行代码不重要,代码重要的是思想。
  • 安全性和稳定性,这我还没经过大型项目和时间的推敲,不好做出评价。
  • 性能,网上说性能提升了,那就是提升了吧。
  • 多了解新的东西。在里边寻找思想上的提升。

总结

一定要多思考,如果人永远待在舒适圈的话,人永远不会成长。共勉

觉得作者写的不错的,值得你们借鉴的话,就请点一个免费的赞吧!这个对我来说真的很重要。૮(˶ᵔ ᵕ ᵔ˶)ა