Wend看源码-Java.util 工具类学习(上)
摘要
本文汇总了基于JDK 21版本的Java.util包中各类工具类的学习与运用指南。旨在为广大开发者提供一份详尽的中文参考资料,以及具体的应用示例,助力开发者更好地掌握和运用这些工具类。其中 Wend看源码-Java.util 工具类学习(上)篇主要介绍的是java.util 包下的工具类。而Wend看源码-Java.util 工具类学习(下)篇主要介绍的是java.util子包,如java.util.concurrent 下的工具类,并包含一些过时工具类的介绍。
Collections
java.util.Collections
它提供了一系列静态方法,用于对集合(如List
、Set
、Map
等)进行操作。这些操作包括排序、查找、替换、同步等多种功能,帮助开发者更方便地处理集合数据。 关于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 来返回true
或false。
-
nextFloat:
返回此随机数生成器序列中一个介于0.0
和1.0
之间的伪随机、均匀分布的float
值,通过next(24)
的结果与特定系数运算得到 -
nextDouble:
返回此随机数生成器序列中一个介于0.0
和1.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
方法可以高效地创建多个独立的伪随机数生成器,每个生成器可以在不同的线程或并行任务中独立使用,避免了线程间的竞争和同步开销。 -
随机数质量和分布特性:在生成随机数的质量上,
SplittableRandom
和Random
都能生成均匀分布的伪随机数,但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
可以使用正则表达式来解析文本,并且可以方便地从各种输入源(如文件、输入流、字符串等)中读取数据。
特点
-
多用途输入解析:
Scanner
可以用来解析不同类型的输入,包括基本数据类型(如int
、double
、float
等)和字符串。 -
分隔符:
Scanner
使用分隔符来分隔输入数据。默认的分隔符是空白字符(空格、制表符、换行符等),但可以自定义。 -
正则表达式:
Scanner
支持使用正则表达式来定义分隔符或查找特定的输入模式。 -
国际化:
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):必需,定义了参数应该如何被格式化(例如
d
,f
,s
等)。
-
-
常见转换字符
-
%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
方法时,比如一个包含x
、y
、z
三个字段的对象,可通过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
对象,如果obj
为null
且supplier
为null
或者supplier.get()
返回的值为null
,会抛出NullPointerException
异常。
-
-
checkIndex系列方法:
用于检查索引或子范围是否越界。-
checkIndex
检查单个索引是否在0
(包含)到length
(不包含)范围内; -
checkFromToIndex
检查从fromIndex
(包含)到toIndex
(不包含)的子范围是否在指定总范围(0
到length
,边界同样是包含和不包含关系)内; -
checkFromIndexSize
检查从fromIndex
(包含)开始长度为size
的子范围是否在指定总范围(0
到length
)内; -
这些方法在越界时会抛出
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博客