当前位置: 首页 > article >正文

Wend看源码-Java.util 工具类学习(上)

摘要

        本文汇总了基于JDK 21版本的Java.util包中各类工具类的学习与运用指南。旨在为广大开发者提供一份详尽的中文参考资料,以及具体的应用示例,助力开发者更好地掌握和运用这些工具类。其中 Wend看源码-Java.util 工具类学习(上)篇主要介绍的是java.util 包下的工具类。而Wend看源码-Java.util 工具类学习(下)篇主要介绍的是java.util子包,如java.util.concurrent 下的工具类,并包含一些过时工具类的介绍。

Collections

  java.util.Collections它提供了一系列静态方法,用于对集合(如ListSetMap等)进行操作。这些操作包括排序、查找、替换、同步等多种功能,帮助开发者更方便地处理集合数据。 关于java.util.Collections具体的更详细的学习内容,请参看下面这篇文章:

Wend看源码-Java-Collections 工具集学习-CSDN博客

Arrays

  java.util.Arrays 是 Java 标准库中的一个实用工具类,它提供了各种静态方法来操作数组,包括排序、搜索、比较、填充等。这些方法简化了对数组的操作,并且在很多情况下可以提高代码的可读性和效率。关于java.util.Arrays具体的更详细的学习内容,请参看下面这篇文章:

Wend看源码-Java-Arrays 工具集学习-CSDN博客

Comparator

        Comparator 用于定义比较两个对象的逻辑,通过实现这个接口,可以自定义对象之间的比较规则。这种比较规则可以用于排序操作(如Collections.sort()方法或者Arrays.sort()方法)以及其他需要比较对象大小的场景。

  • Collections.sort 的内部实现是基于Arrays.sort() 方法实现的。

Properties

  java.util.Properties类主要用于处理配置文件或属性列表。它提供了一种简单的方式来存储和检索键值对,其中键和值都是字符串类型。这种特性使得它在处理应用程序的配置信息(如数据库连接参数、应用程序设置等)方面非常有用。

存储结构

  Properties本质上是一个哈希表,它继承了Hashtable的存储结构特点。这意味着它可以通过键快速地查找和存储值,内部使用散列算法来优化查找操作。例如,在内存中,它会根据键的哈希值将键值对存储在特定的位置,以便在需要时能够高效地获取。

数据操作

  • 存储数据:可以使用setProperty(String key, String value)方法来添加或修改键值对。例如:

import java.util.Properties;
public class PropertiesExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.setProperty("database.host", "localhost");
        properties.setProperty("database.port", "3306");
    }
}
  • 获取数据:使用getProperty(String key)方法来获取指定键对应的的值。如果键不存在,则返回null。也可以使用getProperty(String key, String defaultValue)方法,在键不存在时返回默认值。例如:

import java.util.Properties;
public class PropertiesExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.setProperty("database.host", "localhost");
        String host = properties.getProperty("database.host");
        String nonExistentValue = properties.getProperty("nonExistentKey");
        String defaultValue = properties.getProperty("nonExistentKey", "defaultValue");
        System.out.println("主机地址: " + host);
        System.out.println("不存在的键的值: " + nonExistentValue);
        System.out.println("不存在的键的默认值: " + defaultValue);
    }
}
  • 遍历数据:可以使用keys()entrySet()方法来遍历Properties中的所有键值对。keys()方法返回一个枚举(Enumeration),包含了所有的键,而entrySet()方法返回一个集合(Set),其中包含了所有的Map.Entry对象,每个对象代表一个键值对。例如:

import java.util.Enumeration;
import java.util.Properties;
import java.util.Set;
public class PropertiesExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.setProperty("key1", "value1");
        properties.setProperty("key2", "value2");
        // 使用keys()方法遍历
        Enumeration<?> propertyNames = properties.keys();
        while (propertyNames.hasMoreElements()) {
            String key = (String) propertyNames.nextElement();
            String value = properties.getProperty(key);
            System.out.println(key + " = " + value);
        }
        // 使用entrySet()方法遍历
        Set<?> entrySet = properties.entrySet();
        for (Object entryObj : entrySet) {
            java.util.Map.Entry<?,?> entry = (java.util.Map.Entry<?,?>) entryObj;
            System.out.println(entry.getKey() + " = " + entry.getValue());
        }
    }
}
  • 加载配置文件:Properties类提供了从文件中加载属性的功能。可以使用load(InputStream inStream)方法从输入流(如文件输入流)中读取属性列表。例如,假设有一个名为config.properties的配置文件,内容如下:

# 配置文件示例
database.name=myDB
user.name=admin
user.password=123456

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class PropertiesExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        try {
            FileInputStream fis = new FileInputStream("config.properties");
            properties.load(fis);
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("数据库名称: " + properties.getProperty("database.name"));
    }
}
  • 保存配置文件:使用store(OutputStream out, String comments)方法将Properties中的内容保存到文件中。其中comments参数用于在文件开头添加注释信息。例如,对已有的Properties对象进行修改后,将其保存到另一个文件中:

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class PropertiesExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        try {
            // 加载已有配置文件
            FileInputStream fis = new FileInputStream("config.properties");
            properties.load(fis);
            fis.close();
            // 修改属性值
            properties.setProperty("user.password", "newPassword");
            // 保存到新文件
            FileOutputStream fos = new FileOutputStream("newConfig.properties");
            properties.store(fos, "Updated configuration");
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Random

  java.util.Random是一个用于生成伪随机数的类。伪随机数是通过确定性算法生成的数字序列,看起来是随机的,但实际上是基于一个初始的种子(seed)值来产生的。Random类提供了多种方法来生成不同类型的随机数,如整数、浮点数等,这些随机数可以用于模拟随机事件、生成测试数据、游戏开发等众多场景。

Random的主要方法

  • setSeed:(可选操作)使用提供的long类型种子值设置或更新此随机数生成器的种子。在该类中的实现是原子性地更新种子为经过特定运算的值,并清除nextGaussian方法使用的相关标志位,且只会使用给定种子值的 48 位。

  • next:生成下一个伪随机数,是其他随机数生成方法的基础实现方法。通过原子性更新内部种子状态,并返回按规则处理后的指定低阶bits位的伪随机整数值,其实现基于线性同余伪随机数生成算法。

  • nextInt:返回此随机数生成器序列中的下一个伪随机、均匀分布的int值,其实现直接调用next(32)来获取。

  • nextLong:返回此随机数生成器序列中的下一个伪随机、均匀分布的long值,通过组合两次调用next(32)的结果来构造返回值,不过由于其种子只有 48 位,所以不能返回所有可能的long值。

  • nextBoolean:返回此随机数生成器序列中的下一个伪随机、均匀分布的boolean值,通过判断next(1)的结果是否为 0 来返回truefalse。

  • nextFloat:返回此随机数生成器序列中一个介于0.01.0之间的伪随机、均匀分布的float值,通过next(24)的结果与特定系数运算得到

  • nextDouble:返回此随机数生成器序列中一个介于0.01.0之间的伪随机、均匀分布的double值,按照特定的位运算和与系数的乘法运算来生成。

  • nextGaussian:返回此随机数生成器序列中的下一个伪随机、符合高斯(正态)分布(均值为0.0,标准差为1.0)的double值,通过一种称为 “极坐标法” 的算法来实现,会在内部维护并复用部分计算结果来提升效率,同时保证线程安全。

Java 8 新增方法
  • ints:返回一个无限数量或指定数量(streamSize个)伪随机int值的流。

  • longs: 用于生成long类型的伪随机数流,

  • doubles:用于生成double类型的伪随机数流

SplittableRandom

        SplittableRandom是 Java 8 中引入的一个类,用于生成高质量的伪随机数。它是Random类的增强版,主要用于在并行计算环境下高效地生成随机数。SplittableRandom通过提供一种简单的分裂(split)操作,使得在多线程或者并行任务中,每个线程或任务都能拥有自己独立的伪随机数生成器,并且这些生成器具有良好的统计特性和独立性。

优势

  • 并发性能优势:Random类在多线程环境下存在性能问题。因为Random的实例是线程不安全的,当多个线程共享一个Random实例并频繁调用其方法生成随机数时,可能会导致竞争条件(race conditions),需要通过额外的同步机制(如使用synchronized关键字)来保证线程安全,这会带来额外的开销。而SplittableRandom专为并行场景设计,它的split方法可以高效地创建多个独立的伪随机数生成器,每个生成器可以在不同的线程或并行任务中独立使用,避免了线程间的竞争和同步开销。

  • 随机数质量和分布特性:在生成随机数的质量上,SplittableRandomRandom都能生成均匀分布的伪随机数,但SplittableRandom使用了更复杂的算法,能够提供更好的统计特性和更长的周期(即生成的随机数序列在重复之前的长度更长)。这使得在一些对随机数质量要求较高的应用场景(如模拟实验、密码学的某些简单应用等)中,SplittableRandom更具优势。

Locale

   java.util.Locale类用于表示特定的地理、政治或文化区域。它主要用于处理与地域相关的操作,如日期、时间、数字、货币格式等的本地化。通过Locale类,可以根据不同的地区设置来呈现符合当地习惯的信息,从而提供更好的用户体验。

在本地化操作中的应用

  • 日期和时间格式化:下面这个列子,我们使用了不同的Locale对象(美国英语和法国法语)来格式化相同的日期,输出的日期格式会符合当地的习惯。
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        Date date = new Date();
        Locale localeUs = new Locale("en", "US");
        DateFormat dateFormatUs = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, localeUs);
        System.out.println(dateFormatUs.format(date));
        
        Locale localeFr = new Locale("fr", "FR");
        DateFormat dateFormatFr = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, localeFr);
        System.out.println(dateFormatFr.format(date));
    }
}
  • 数字和货币格式化:下面这个列子展示了使用英国英语和日本日语的Locale对象来格式化货币,输出的格式会因地区而异。  
import java.text.NumberFormat;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        double number = 1234.56;
        Locale localeGb = new Locale("en", "GB");
        NumberFormat numberFormatGb = NumberFormat.getCurrencyInstance(localeGb);
        System.out.println(numberFormatGb.format(number));
        
        Locale localeJp = new Locale("ja", "JP");
        NumberFormat numberFormatJp = NumberFormat.getCurrencyInstance(localeJp);
        System.out.println(numberFormatJp.format(number));
    }
}

ResourceBundle

  java.util.ResourceBundle是一个用于读取本地化资源的抽象类。它提供了一种方便的方式来管理应用程序中的文本消息、配置信息等资源,使得这些资源可以根据用户的语言环境或者其他条件进行本地化处理。通过ResourceBundle,可以轻松地将应用程序与不同语言的资源文件进行关联,实现国际化和本地化的功能。

使用场景

  • 国际化和本地化:这是ResourceBundle最主要的应用场景。在开发面向不同国家和语言用户的应用程序时,通过ResourceBundle可以方便地将用户界面文本、提示信息、错误消息等资源本地化。例如,一个跨国电商应用可以使用ResourceBundle为不同国家的用户提供不同语言的商品描述、购物流程提示等。

  • 配置管理的本地化版本:除了文本消息,ResourceBundle也可以用于管理本地化的配置信息。例如,不同国家的用户可能需要连接到不同的服务器地址或者使用不同的支付网关,这些配置信息可以通过ResourceBundle进行本地化管理。

Scanner

  Scanner 用于解析基本类型和字符串的简单文本扫描器。Scanner 可以使用正则表达式来解析文本,并且可以方便地从各种输入源(如文件、输入流、字符串等)中读取数据。

特点

  1. 多用途输入解析:Scanner 可以用来解析不同类型的输入,包括基本数据类型(如 intdoublefloat 等)和字符串。

  2. 分隔符:Scanner 使用分隔符来分隔输入数据。默认的分隔符是空白字符(空格、制表符、换行符等),但可以自定义。

  3. 正则表达式:Scanner 支持使用正则表达式来定义分隔符或查找特定的输入模式。

  4. 国际化:Scanner 可以根据不同的区域设置来解析数字和日期。

常用方法

  • next(): 读取输入的下一个标记(默认为空白字符分隔的字符串)。

  • nextLine(): 读取输入的下一行。

  • nextInt(): 读取输入的下一个整数。

  • nextDouble(): 读取输入的下一个双精度浮点数。

  • nextBoolean(): 读取输入的下一个布尔值。

  • hasNext(): 检查输入中是否还有其他标记。

  • hasNextInt(): 检查输入中是否还有下一个整数。

  • useDelimiter(Pattern pattern): 设置扫描器的分隔模式。

示例

import java.util.Scanner;

public class ScannerExample {
    public static void main(String[] args) {
        // 创建一个 Scanner 对象,用于从控制台读取输入
        Scanner scanner = new Scanner(System.in);

        // 提示用户输入
        System.out.println("Enter your name:");
        String name = scanner.nextLine(); // 读取一行文本

        System.out.println("Enter your age:");
        int age = scanner.nextInt(); // 读取一个整数

        // 输出读取的数据
        System.out.println("Hello, " + name + "! You are " + age + " years old.");

        // 关闭扫描器
        scanner.close();
    }
}

        在这个例子中,程序首先创建了一个 Scanner 对象来读取控制台的输入。然后,它使用 nextLine() 方法读取用户的名字,使用 nextInt() 方法读取用户的年龄,并打印出这些信息。
 

 Formatter

  java.util.Formatter是一个用于格式化输出的类。它提供了一种灵活的方式来将数据按照指定的格式转换为字符串。这在需要生成格式化文本输出的场景中非常有用,例如生成报表、日志文件、或者格式化用户界面显示的文本等。

格式化语法

        Formatter使用类似于printf风格的格式化字符串。格式化字符串包含普通字符和格式说明符。格式说明符以%开头,后面跟着一些字符来指定数据类型、宽度、精度等信息。

  • 一个格式说明符通常由以下部分组成:

    • %:每个格式说明符都以百分号 % 开始。

    • 标志 (Flags):可选,用来控制对齐、符号显示等(例如 -+0)。

    • 宽度 (Width):可选,指定最小字段宽度。

    • .精度 (Precision):对于浮点数是小数点后的位数;对于字符串是最大字符数。

    • 转换字符 (Conversion Character):必需,定义了参数应该如何被格式化(例如 dfs 等)。

  • 常见转换字符

    • %d: 整数

    • %f: 浮点数

    • %s: 字符串

    • %t: 日期时间

    • %n: 行分隔符(根据平台)

  • 标志 (Flags)

    • -: 左对齐

    • +: 显示正负号

    • 0: 使用零填充

    • ,: 对数字使用逗号作为千位分隔符

    • (: 负数用括号表示

代码示例

public static void formatterTest(){
        // 创建一个Formatter对象,输出到StringBuffer
        StringBuffer sb = new StringBuffer();
        Formatter formatter = new Formatter(sb, Locale.CHINESE);

        // 示例1:格式化整数和浮点数
        int intValue = 42;
        double doubleValue = 3.1415926535;
        formatter.format("Integer: %d, Float: %.2f%n", intValue, doubleValue);
        System.out.println(sb.toString());
        sb.setLength(0); // 清空StringBuffer以便重用

        // 示例2:左对齐和右对齐
        String leftAligned = "left";
        String rightAligned = "right";
        formatter.format("Left aligned: %-10s | Right aligned: %10s%n", leftAligned, rightAligned);
        System.out.println(sb.toString());
        sb.setLength(0);

        // 示例3:带宽度和填充
        int number = 7;
        formatter.format("Number with padding: %05d%n", number);
        System.out.println(sb.toString());
        sb.setLength(0);

        // 示例4:格式化日期
        Date currentDate = new Date();
        formatter.format("Current date and time: %tc%n", currentDate);
        System.out.println(sb.toString());

        // 关闭Formatter
        formatter.close();

    }

StringJoiner

  java.util.StringJoiner 是 Java 8 引入的一个实用类,它被设计用来简化多个字符串的连接操作,并允许在这些字符串之间插入分隔符。此外,还可以设置一个前缀和后缀来包围最终生成的字符串。

主要功能

  • 添加元素:使用 add(String) 方法可以向 StringJoiner 中添加新的字符串。

  • 指定分隔符:构造 StringJoiner 对象时可以指定一个分隔符,该分隔符将被用作连接字符串之间的间隔。

  • 设置前缀和后缀:可以通过构造函数或 setPrefix() 和 setSuffix() 方法为最终结果设置前缀和后缀。

示例代码

StringJoiner joiner = new StringJoiner(", ", "[", "]");
joiner.add("a").add("b").add("c");
System.out.println(joiner.toString()); // 输出: [a, b, c]

        在这个例子中,我们创建了一个 StringJoiner,指定了逗号加空格作为分隔符,方括号作为前缀和后缀。然后我们添加了三个字符串 "a"、"b" 和 "c"。最后打印的结果是 [a, b, c]

使用场景

  StringJoiner 在需要构建由分隔符分隔的字符串列表时非常有用,比如创建 CSV 格式的行数据,或者构建 SQL 查询语句中的 IN 子句等。与传统的循环加上字符串拼接相比,StringJoiner 提供了一种更简洁的方式,并且性能上也有所优化,因为它内部使用了 StringBuilder 来进行高效的字符串连接。

UUID

  java.util.UUID 是 Java 提供的一个类,用于生成通用唯一标识符(Universally Unique Identifier, UUID)。UUID 是一种在分布式系统中用来产生唯一标识符的算法标准。Java 的 UUID 类允许开发者创建两种类型的 UUID:基于时间戳和节点信息的 UUID(版本1),以及基于命名空间和名称的 UUID(版本3、5)。

特点

  • 全局唯一性:UUID 的设计目的是为了在全球范围内保证其唯一性。

  • 随机性或伪随机性:某些版本的 UUID 是通过随机数或者伪随机数生成的。

  • 无序性:不同时间生成的 UUID 之间没有顺序关系。

  • 不可预测性:对于随机生成的 UUID,下一个 UUID 是不可预测的。

UUID版本

  • 版本 1:基于时间和节点生成,包含时间戳和 MAC 地址等信息,可保证在全球范围的唯一性,但使用 MAC 地址可能带来安全性问题。

  • 版本 2:与版本 1 类似,但会把时间戳的前 4 位置换为 POSIX 的 UID 或 GID,主要用于 DCE 安全环境,在实际中较少用到。

  • 版本 3:通过对命名空间标识符和名称进行 MD5 哈希计算生成,适用于在特定命名空间内生成唯一标识符。

  • 版本 4:使用随机或伪随机数生成,虽然组合数量相对较少,但产生重复的概率仍然很低,可以满足大多数应用场景对唯一性的要求。

  • 版本 5:与版本 3 类似,只是哈希算法使用 SHA-1,相比 MD5 更加安全,适用于对安全性要求较高的命名空间内的唯一标识生成。

Optional

  java.util.Optional<T> 是 Java 8 引入的一个容器类,它代表一个值可能存在(非空)也可能不存在(空)。其主要目的是为了更好地处理可能为 null 的值,从而减少 NullPointerException 的发生。Optional 可以让代码更加清晰地表达出某个方法可能会返回一个值或根本不返回任何内容。

主要功能

  • 避免 null 检查:通过使用 Optional,可以更明确地表示一个值是可选的,而不是直接返回 null

  • 流式 API 支持:Optional 提供了多种方法来处理内部的值,包括映射、过滤和执行默认操作等,这些方法支持函数式编程风格。

  • 提高代码可读性:使用 Optional 可以使代码更具表达力,因为它的方法名往往非常直观,比如 ifPresent()orElse()orElseGet() 等。

主要方法

  • Optional.of(T value):创建一个包含非空值的 Optional 实例。

  • Optional.ofNullable(T value):如果值为 null,则创建一个空的 Optional;否则,创建一个包含给定值的 Optional

  • Optional.empty():创建一个空的 Optional 实例。

  • T get():如果存在值,则返回该值;否则抛出 NoSuchElementException

  • T orElse(T other):如果存在值,则返回该值;否则返回指定的默认值。

  • T orElseGet(Supplier<? extends T> supplier):如果存在值,则返回该值;否则调用供应商提供的方法来生成默认值。

  • T orElseThrow(Supplier<? extends X> exceptionSupplier):如果存在值,则返回该值;否则抛出由供应商提供的异常。

  • boolean isPresent():判断是否有值存在。

  • void ifPresent(Consumer<? super T> consumer):如果有值存在,则对其执行给定的操作。

  • <U> Optional<U> map(Function<? super T, ? extends U> mapper):如果存在值,则将其转换为另一种类型,并封装在新的 Optional 中。

  • <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper):类似 map(),但允许将结果再次包装在一个 Optional 中,适用于链式调用。

  • Optional<T> filter(Predicate<? super T> predicate):根据提供的谓词测试值是否存在,若谓词返回 true 则保持原值,否则返回空 Optional

使用示例

public class OptionalExample {
    public static void main(String[] args) {
        // 创建一个包含值的Optional实例
        Optional<String> opt = Optional.of("Hello World");

        // 如果有值就打印出来
        opt.ifPresent(System.out::println);

        // 创建一个可能为空的Optional实例
        Optional<String> nullableOpt = Optional.ofNullable(null);

        // 如果为空则提供一个默认值
        String result = nullableOpt.orElse("Default Value");
        System.out.println(result); // 输出: Default Value

        // 使用map进行转换
        Optional<Integer> lengthOpt = opt.map(String::length);
        lengthOpt.ifPresent(len -> System.out.println("Length of string: " + len));
    }
}

 Objects

  java.util.Objects是一个工具类,它提供了一些用于操作对象的实用方法。这个类是从 Java 7 开始引入的,目的是为了提供一些空指针安全的方法来处理对象,减少在操作对象时可能出现的NullPointerException(空指针异常)。

主要方法

  • equals:用于比较两个对象是否相等。

  • deepEquals:用于判断两个对象是否深度相等。两个null值是深度相等的;如果两个参数都是数组,会使用Arrays.deepEquals算法来判断相等性;否则通过第一个参数的equals方法来判断。

  • hash:为一系列输入值生成哈希码,其原理是将所有输入值视为放在一个数组中,然后调用Arrays.hashCode(values)来生成哈希码。常用于包含多个字段的对象实现hashCode方法时,比如一个包含xyz三个字段的对象,可通过return Objects.hash(x, y, z);来实现hashCode方法。

  • hashCode:返回给定对象的哈希码。

  • toString:如果参数不为null,返回调用该对象的toString方法的结果;如果参数为null,则返回"null"字符串。

  • toIdentityString:从 Java 19 开始引入,构造一个表示对象的字符串,且不会调用对象的任何可重写方法。返回的字符串格式为o.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(o))。

  • compare:用于比较两个同类型对象。

  • null 处理系列方法:用于更合理的处理Null 值。

    • isNull:如果提供的引用为null,则返回true;否则返回false,常用于作为Predicate进行过滤操作(如filter(Objects::isNull))。

    • nonNull:isNull相反,如果提供的引用不为null,则返回true;否则返回false,同样可作为Predicate使用(如filter(Objects::nonNull))。

    • requireNonNull:检查指定的对象引用是否为null,主要用于方法和构造函数中的参数验证。requireNonNullElse:如果第一个参数不为null,则返回第一个参数;否则返回第二个非null参数(如果第二个参数为null,会抛出NullPointerException异常并提示"defaultObj")。

    • requireNonNullElseGet:如果第一个参数不为null,返回第一个参数;否则返回通过supplier.get()获取的非null对象,如果objnullsuppliernull或者supplier.get()返回的值为null,会抛出NullPointerException异常。

  • checkIndex系列方法:用于检查索引或子范围是否越界。

    • checkIndex检查单个索引是否在0(包含)到length(不包含)范围内;

    • checkFromToIndex检查从fromIndex(包含)到toIndex(不包含)的子范围是否在指定总范围(0length,边界同样是包含和不包含关系)内;

    • checkFromIndexSize检查从fromIndex(包含)开始长度为size的子范围是否在指定总范围(0length)内;

    • 这些方法在越界时会抛出IndexOutOfBoundsException异常。

示例代码

   public static void main(String[] args) {
        equalsExample();
        hashExample();
        toStringExample();
        compareExample();
        nullMethodExample();
        checkIndexExample();
    }

    public static void equalsExample() {
        // 示例1 equals 比较两个对象是否相等
        System.out.println(java.util.Objects.equals(null, null)); // true
        System.out.println(java.util.Objects.equals(null, "Hello")); // false
        System.out.println(java.util.Objects.equals("Hello", null)); // false
        System.out.println(java.util.Objects.equals("Hello", "Hello")); // true
        // deepEquals
        System.out.println(java.util.Objects.deepEquals(new String[]{"Hello"}, new String[]{"Hello"})); // true
        System.out.println(java.util.Objects.deepEquals(new String[]{"Hello"}, new String[]{"World"})); // false
    }

    public static void hashExample() {
        // 示例2 hash
        System.out.println(java.util.Objects.hash("Hello", "World")); // 124732529
        System.out.println(java.util.Objects.hash("Hello", "World", "Java")); // 182916470

        //  hashCode
        System.out.println(java.util.Objects.hashCode("Hello")); // 69609650
    }

    public static void toStringExample() {
        // 示例3 toString
        System.out.println(java.util.Objects.toString(null)); // null
        System.out.println(java.util.Objects.toString("Hello")); // Hello
        System.out.println(java.util.Objects.toString("Hello", "World")); // Hello
        // toIdentityString
        System.out.println(java.util.Objects.toIdentityString("Hello")); // java.lang.String@1b6d3586
    }

    public static void compareExample() {
        // 示例5 compare
        System.out.println(java.util.Objects.compare("Hello", "World", String::compareTo)); // -15
        System.out.println(java.util.Objects.compare("World", "Hello", String::compareTo)); // 15
    }

    public static void nullMethodExample() {
        // 示例4 isNull
        System.out.println(java.util.Objects.isNull(null)); // true
        System.out.println(java.util.Objects.isNull("Hello")); // false
        // nonNull
        System.out.println(java.util.Objects.nonNull(null)); // false
        System.out.println(java.util.Objects.nonNull("Hello")); // true
        // requireNonNull
        java.util.Objects.requireNonNull("Hello", "Argument should not be null");
        // java.util.Objects.requireNonNull(null, "Argument should not be null"); // 抛出 NullPointerException
        // requireNonNullElse
        System.out.println(java.util.Objects.requireNonNullElse("Hello", "World")); // Hello
        System.out.println(java.util.Objects.requireNonNullElse(null, "World")); // World
        // requireNonNullElseGet
        System.out.println(java.util.Objects.requireNonNullElseGet("Hello", () -> "World")); // Hello
        System.out.println(java.util.Objects.requireNonNullElseGet(null, () -> "World")); // World

    }

    public static void checkIndexExample(){
        // checkIndex
        java.util.Objects.checkIndex(1, 3); // 不抛出异常
        // java.util.Objects.checkIndex(3, 3); // 抛出 IndexOutOfBoundsException
        // checkFromToIndex

        java.util.Objects.checkFromToIndex(1, 2, 3); // 不抛出异常
        // java.util.Objects.checkFromToIndex(1, 3, 2); // 抛出 IndexOutOfBoundsException
        // checkFromIndexSize
        java.util.Objects.checkFromIndexSize(1, 2, 3); // 不抛出异常
        // java.util.Objects.checkFromIndexSize(1, 3, 2); // 抛出 IndexOutOfBoundsException
    }

参考文献/AIGC

通义tongyi.ai_你的全能AI助手-通义千问

豆包

相关文章推荐

     JavaUsefulMode: 基于Java 语言的自定义实用工具集

        JavaUsefulMode是小编编写Java方向学习专栏时的代码示例汇总总结,其中内容包含了该篇文章所涉及的Java代码示例。感兴趣的小伙伴可以直接下载学习。

Wend看源码-Java.util 工具类学习(下)-CSDN博客

Wend看源码-Java-Collections 工具集学习-CSDN博客

Wend看源码-Java-Arrays 工具集学习-CSDN博客

Wend看源码-Java-Executor异步执行器学习-CSDN博客

Wend看源码-Java-fork/Join并行执行任务框架学习-CSDN博客


http://www.kler.cn/a/464376.html

相关文章:

  • ARM 汇编基础总结
  • Elasticsearch:利用 AutoOps 检测长时间运行的搜索查询
  • BGP基础配置实验
  • 解决uniapp H5页面限制输入框只能输数字问题
  • 在 pandas.Grouper() 中,freq 参数用于指定时间频率,它定义了如何对时间序列数据进行分组。freq 的值可以是多种时间单位
  • ES_如何设置ElasticSearch 8.0版本的匿名访问以及https_http模式的互相切换
  • CertiK《Hack3d:2024年度安全报告》(附报告全文链接)
  • 【Java 学习】Comparable接口 和 Comparator接口,掌控排序逻辑解析,深入 Comparable 和 Comparator 的优雅切换
  • linux进阶
  • Kafka优势剖析-分布式架构
  • 迅为RK3568开发板编译Android12源码包-设置屏幕配置
  • [人工智能] 结合最新技术:Transformer、CLIP与边缘计算在提高人脸识别准确率中的应用
  • halcon中的BLOB与灰度直方图的分析与理解
  • 华为iotda sdk发送消息无法更新quickstartpython问题解决
  • 丢弃法hhhh
  • python中subprocess指定用户与传递环境变量
  • 【重庆】《政务数字化应用费用测算规范》(T/CDCIDA 001—2023)-省市费用标准解读系列36
  • 单片机的存储器类型
  • DC-DC 降压转换器设计提示和技巧
  • Echart实现3D饼图示例
  • 【DSP/matlab】fftshift 是什么意思?在信号处理中有什么作用?
  • C#编写的盘符图标修改器 - 开源研究系列文章
  • STM32CUBEIDE FreeRTOS操作教程(十二):std dynamic memory 标准动态内存
  • 电子应用设计方案82:智能 AI 椅子系统设计
  • 软件工程期末复习汇总
  • 小程序组件 —— 24 组件案例 - 绘制公司信息区域