探秘JDK 10:崭新特性悉数解析

news2025/1/23 12:58:16

欢迎来到我的博客,代码的世界里,每一行都是一个故事


在这里插入图片描述

探秘JDK 10:崭新特性悉数解析

    • 前言
    • 局部变量类型推断(var关键字)
    • 线程本地握手
      • 背景和用途:
      • 如何使用:
      • 优势:
    • 改进的option
    • 集合工厂方法
      • List.of() 方法:
      • Set.of() 方法:
      • Map.of() 方法:
      • 注意事项:
    • 类数据共享
      • 类数据共享(CDS):
      • CDS的使用:

前言

Java 10如同一位经历了时光洗礼的程序语言,蕴含着更多的智慧和便利。在这个版本中,Java似乎变得更加现代、更加富有活力。本文将带你进入Java 10的独特世界,一起感受这场编程时代的蜕变。

局部变量类型推断(var关键字)

在Java 10中引入了局部变量类型推断,通过使用var关键字,可以在不显式指定变量类型的情况下进行局部变量声明。这项特性旨在提高代码的简洁性和可读性,同时保持Java的强类型特性。

使用var的基本语法如下:

var variableName = initialization;

这里,variableName是你声明的变量名,而initialization是你给变量赋值的表达式。编译器会根据初始化表达式的类型推断出变量的类型。

以下是一个简单的例子,演示了var的使用:

public class VarExample {
    public static void main(String[] args) {
        var message = "Hello, Java 10!";
        var number = 42;
        
        System.out.println(message);
        System.out.println("The answer is: " + number);
    }
}

在这个例子中,message被推断为String类型,而number被推断为int类型。注意,一旦变量被赋予初始值,其类型就被固定,不能再更改。

使用var的好处之一是可以在声明变量的同时进行初始化,提高了代码的紧凑性。然而,为了保持代码的可读性,应该在命名变量时选择具有明确含义的名称。

需要注意的是,var不能用于方法参数、构造函数参数、方法返回类型等场景,它仅用于局部变量。此外,不要滥用var,应该在保持代码清晰可读的前提下使用它。

在使用局部变量类型推断时,确保添加适当的注释,特别是在初始化表达式不够清晰时,以帮助其他开发人员理解代码的意图。

线程本地握手

Thread-Local Handshakes(线程本地握手)是Java中一种用于线程间通信和数据传递的机制,引入自JEP 312(JEP是Java Enhancement Proposal的缩写),它主要用于改进在多线程环境下的本地数据管理。

背景和用途:

在多线程应用程序中,每个线程可能需要访问一些线程本地的数据,但以前的实现方式(如ThreadLocal)可能会涉及到较高的开销,尤其是在有大量线程的情况下。

Thread-Local Handshakes的目标是通过提供一种轻量级的、低开销的机制来改善这种情况。其主要用途包括:

  1. 线程间通信: 允许线程之间安全地传递信息,以便进行协同工作或执行一些特定的任务。

  2. 本地数据管理: 更有效地管理线程本地的数据,而不引入过多的开销。

如何使用:

Thread-Local Handshakes 是通过 HotSpot 虚拟机的 Thread 类的 handshake 方法来实现的。以下是简要的使用步骤:

  1. 在每个线程中注册握手: 线程需要在其代码中显式注册握手。这可以通过调用 Thread.onSpinWait() 方法实现。

    Thread.onSpinWait();
    
  2. 执行握手动作: 当线程需要执行握手时,可以使用 Thread.handshake() 方法。

    Thread.handshake();
    
  3. 在握手处理器中定义操作: 在注册握手时,可以提供一个实现 Runnable 接口的握手处理器。这个处理器定义了握手时需要执行的操作。

    Thread.handshake(() -> {
        // 握手时执行的操作
    });
    

优势:

  • 低开销: Thread-Local Handshakes 被设计为一种低开销的机制,可以更有效地在多线程环境中进行线程本地数据的管理和通信。

  • 灵活性: 开发人员可以在需要的地方手动触发握手,从而更精确地控制线程间的操作。

  • 性能提升: 对于一些多线程应用场景,使用 Thread-Local Handshakes 可以带来性能上的提升,特别是在大量线程竞争本地数据的情况下。

在使用 Thread-Local Handshakes 时,建议仔细评估应用程序的特定需求,以确保它是适合的。此外,如同其他并发机制一样,确保代码正确同步以避免潜在的并发问题。

改进的option

  1. 新的orElseThrow方法(Java 10):
    在Java 10中,Optional类的orElseThrow()方法引入了一个新的重载,允许你使用一个无参数的Supplier来提供异常。这使得在创建异常时可以延迟执行,提供了更多的灵活性。

    // Java 10
    Optional<String> optionalString = /* some optional */;
    String result = optionalString.orElseThrow(() -> new MyException("Value not present"));
    

    这样的改进使得在处理Optional时更容易以一种更灵活和优雅的方式处理异常情况。

请确保你的代码是基于Java 10及更高版本,以充分利用这些改进。这种改进是为了提高Optional类的易用性和灵活性,特别是在处理异常的情况下。

集合工厂方法

Java 10引入了一组新的集合工厂方法,使得创建不可变集合变得更加简单和紧凑。这些工厂方法属于ListSetMap接口,允许你以一种更清晰、更简洁的方式创建不可变的集合对象。

List.of() 方法:

List.of() 方法用于创建一个不可变的列表,它接受可变数量的参数并返回一个不可变的List实例。

// Java 10
List<String> immutableList = List.of("apple", "banana", "orange");

Set.of() 方法:

Set.of() 方法用于创建一个不可变的集合,它接受可变数量的参数并返回一个不可变的Set实例。

// Java 10
Set<String> immutableSet = Set.of("apple", "banana", "orange");

Map.of() 方法:

Map.of() 方法用于创建一个不可变的映射,它接受成对的参数并返回一个不可变的Map实例。

// Java 10
Map<String, Integer> immutableMap = Map.of("apple", 1, "banana", 2, "orange", 3);

注意事项:

  1. 不可变性: 使用这些工厂方法创建的集合是不可变的,任何试图修改它们的操作都会引发UnsupportedOperationException

  2. 重复元素和Null: 如果传递的元素包含重复的值或nullof方法将抛出IllegalArgumentException

  3. 可变参数限制: 这些方法在Java 9之前最多支持10个参数,Java 9及以后版本支持最多30个参数。如果超过这个限制,你可以使用List.of()Set.of()Map.ofEntries()等方法,这些方法接受CollectionMap.Entry实例。

// Java 10
List<String> longList = List.of("apple", "banana", "orange", "grape", "melon", "peach", "pear", "kiwi", "plum", "cherry");

这些集合工厂方法在代码中的使用简化了集合的创建过程,提高了代码的可读性和清晰度。

类数据共享

在Java 10中,引入了类数据共享(CDS)的增强,提供更好的性能和资源利用。类数据共享是一项用于减少启动时间和内存占用的技术。在Java 10中,改进了CDS以支持更大的应用程序和更多的共享类。

类数据共享(CDS):

类数据共享允许将类的元数据和字节码以共享的形式存储在共享的归档文件中,从而避免每个Java进程都重复加载相同的类信息。这可以减少启动时间和内存占用,特别是对于大型应用程序而言。

在Java 10中,通过增强CDS,支持更大的应用程序,并提供更好的资源利用和性能。

CDS的使用:

要使用CDS,你需要首先创建一个共享归档文件(.jsa文件)。这可以通过以下步骤完成:

  1. 启动应用程序时使用-Xshare:dump选项,以生成共享归档文件。

    java -Xshare:dump -XX:+UseAppCDS -Xmx512m -Xms512m -jar YourApplication.jar
    
  2. 在以后的运行中,使用-Xshare:on选项来启用CDS。

    java -Xshare:on -XX:+UseAppCDS -Xmx512m -Xms512m -jar YourApplication.jar
    

这将启用类数据共享,并使用先前生成的共享归档文件。

请注意,CDS的可用性和效果可能受到特定Java版本的影响,因此确保查看相应版本的文档以获取准确的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1330204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

化繁为简,Python快速入门,从基础到实践的学习。

文章目录 前言一、安装与运行命令行运行 python 文件 二、变量和简单数据类型2.1 变量命名规则2.2 字符串2.2.1 字符串的简单运算title()upper()、lower() 2.2.2 合并&#xff08;拼接&#xff09;字符串2.2.3 使用制表符或换行符来添加空白2.2.4 删除空白2.2.5 Python 2 中的 …

Arduino开发实例-APDS-9930环境光和趋近传感器驱动

APDS-9930环境光和趋近传感器驱动 文章目录 APDS-9930环境光和趋近传感器驱动1、APDS-9930介绍2、硬件准备及接线3、驱动实现1、APDS-9930介绍 APDS-9930模块由环境光、红外线和接近传感器组成。 检测距离可达 100 毫米。 APDS-9930 传感器测量环境光。 该传感器还可以在黑暗中…

trino-435版本windows下源码编译

一、源码下载地址 https://github.com/trinodb/trino/tags 二、编译环境及工具准备 1、maven &#xff08;1&#xff09;版本&#xff1a;3.6.3 &#xff08;2&#xff09;settings.xml配置 <?xml version"1.0" encoding"UTF-8"?> <settin…

融资项目——vue之事件监听

vue通过v-on进行事件监听&#xff0c;在标签中使用v-on:xxx&#xff08;事件名称&#xff09;进行监听&#xff0c;事件触发的相应方法定义在Vue对象中的methods中。如下图所示&#xff1a; 上述代码对按钮进行监听&#xff0c;点击按钮后就会触发solve函数。

2016年第五届数学建模国际赛小美赛C题对超级细菌的战争解题全过程文档及程序

2016年第五届数学建模国际赛小美赛 C题 对超级细菌的战争 原题再现&#xff1a; 最近有很多关于我们抗生素耐药性危机的讨论。进化出的能够抵抗抗生素的细菌每年杀死70万人&#xff0c;越来越强大的细菌正在世界各地传播。研究人员担心&#xff0c;我们将进入一个后抗生素时代…

分子动力学模拟

天玑算科研服务_模拟计算_超算租用_实验测试天玑算科研服务致力于营造良好科研生态环境&#xff0c;加速科研成果转换&#xff0c;500余位TOP高校博士计算工程师团队&#xff0c;涉及第一性原理、分子动力学模拟、有限元等领域&#xff0c;为电池、能源、化工、生物医药等领域提…

尚硅谷图解Java设计模式

尚硅谷图解Java设计模式 第 1 章 内容介绍和授课方式Java 设计模式内容介绍先看几个经典的面试题设计模式的重要性 课程亮点和授课方式 第 2 章 设计模式七大原则设计模式的目的设计模式七大原则单一职责原则基本介绍应用实例单一职责原则注意事项和细节 接口隔离原则(Interfac…

HarmonyOS构建第一个ArkTS应用(FA模型)

构建第一个ArkTS应用&#xff08;FA模型&#xff09; 创建ArkTS工程 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。 选择Application应用开发&a…

18 Vue3中使用v-model绑定文本域

概述 使用v-model绑定文本域则属于不太常见的情况了&#xff0c;因为文本域一般会被富文本替代&#xff0c;而富文本的话一般又会引入一些第三方的富文本库&#xff0c;所以在真实的开发中&#xff0c;使用v-model绑定文本域的场景实际上并不多见。 这里&#xff0c;我们了解…

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

安全、效率、成本:混合云数据库管理的三重挑战!

随着业务需求的不断演变&#xff0c;数据在多云平台之间流动&#xff0c;给数据库管控带来了新的层次和复杂性。这给数据库管控带来了前所未有的挑战。企业可能面临着一系列问题&#xff0c;包括安全性挑战、管理复杂性、性能与效率问题、成本控制难题、缺乏统一的管理视图以及…

C++ 链表

目录 链表结构 一&#xff0c;单链表 1.实现基本的增删查改 2.对链表进行一些操作 &#xff08;1&#xff09;删除等于给定值的所有节点。 &#xff08;2&#xff09;翻转链表 &#xff08;3&#xff09; 返回中间节点的地址 &#xff08;4&#xff09;倒数第k个节点 &…

运维管理平台哪个好?如何挑选合适的运维管理平台?

运用运维管理平台来处理一些内部后勤事务或者对外的售后服务&#xff0c;是现在很多企业采用的管理方法&#xff0c;优势是成本较低&#xff0c;效率更高。那么&#xff0c;运维管理平台哪个比较好呢&#xff1f; 选择运维管理平台要先找准自己的需求&#xff0c;然后才能选出合…

Android JNI入门到基础

一、JNI项目创建 AS创建项目时选择NativeC 会创建一个基本的JNI项目 MainActivity中写java层的native方法 具体实现在cpp文件中 native-lib.cpp #include <jni.h> #include <string>extern "C" JNIEXPORT jstring JNICALL Java_com_cn_techvision_j…

增强客户获取能力:探索 B 端影片行销的影响

01 B端企业短视频营销的价值与难点 短视频营销在当今的市场中越来越受到重视。有数据显示&#xff0c;越来越多的市场人将尝试增加短视频营销的预算&#xff0c;并且在2023年&#xff0c;每5个市场人中就有1个人将尝试短视频营销。相较于内容深、信息量大的长视频&#xff0c;…

CRC循环冗余校验

CRC循环冗余检验&#xff1a; 一般会给定生成多项式&#xff0c;通过生成多项式确定P&#xff08;除数&#xff09;的值&#xff08;e.g. P ( X ) X 3 X 2 1 P(X)X^3X^21 P(X)X3X21表示除数 P 1101 P1101 P1101&#xff09; 带传送的数据记为M&#xff0c;M有k位。n位冗…

高级数据结构 <二叉搜索树>

本文已收录至《数据结构(C/C语言)》专栏&#xff01; 作者&#xff1a;ARMCSKGT 目录 前言正文二叉搜索树的概念二叉搜索树的基本功能实现二叉搜索树的基本框架插入节点删除节点查找函数中序遍历函数析构函数和销毁函数(后序遍历销毁)拷贝构造和赋值重载(前序遍历创建)其他函数…

多数据库切换?设计模式--抽象工厂引导下思路

缘起 某日&#xff0c;部门Leader找到小明&#xff1a;“小明&#xff0c;我们公司不是用的SQL Server的数据库吗&#xff0c;但是后面可能会改&#xff0c;比如去使用Access或Mysql或其他的&#xff0c;你觉得该怎么去设计这个代码呢&#xff1f;” 小明一脸所思&#xff0c…

亚马逊测评的重要性和技术选择

亚马逊测评是指卖家通过各种途径&#xff0c;如测评平台、社区、红人等&#xff0c;联系到亚马逊的买家&#xff0c;让其对卖家的产品进行评价和留下真实的综合评价&#xff0c;这对于跨境电商卖家来说非常重要&#xff0c;因为亚马逊的排名和转化率很大程度上取决于产品的评价…

什么是数据资产化?数据怎样成为资产?怎样进入资产负债表?

财政部发布的《企业数据资源相关会计处理暂行规定》将从2024年1月1日起开始实施&#xff0c;为企业数据资源入表提供了基本指引&#xff0c;数据资产化有望迎来爆发期。什么是数据资产化&#xff0c;怎样让数据成为资产&#xff0c;成为了众多国有企业、上市公司关心的问题。 —…