Objects工具类详解

在 Java 编程中,对象的处理是不可避免的。为了简化对象操作并减少空指针异常(NullPointerException)的风险,Java 7 引入了 java.util.Objects 类。这个类包含了一系列静态方法,旨在帮助开发者更安全、更高效地处理对象。

1 引入 Objects 类

Objects 类位于 java.util 包中,因此在使用之前需要导入:

import java.util.Objects;

2 对象判空

在 Java 中,对象的判空操作非常常见。Objects 类提供了两个方法来处理对象的判空:

  • isNull(Object obj):判断对象是否为 null
  • nonNull(Object obj):判断对象是否不为 null

示例代码:

Integer integer = new Integer(1);if (Objects.isNull(integer)) {System.out.println("对象为空");
}if (Objects.nonNull(integer)) {System.out.println("对象不为空");
}

3 对象为空时抛异常

在某些情况下,如果对象为空,我们希望抛出空指针异常。Objects 类提供了 requireNonNull 方法来实现这一功能:

Integer integer1 = new Integer(128);Objects.requireNonNull(integer1);
Objects.requireNonNull(integer1, "参数不能为空");
Objects.requireNonNull(integer1, () -> "参数不能为空");

4 判断两个对象是否相等

Objects 类提供了 equals 方法,用于判断两个对象是否相等。这个方法可以处理 null 值的比较,而不会抛出空指针异常。

示例代码:

Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);System.out.println(Objects.equals(integer1, integer2));  // true

然而,需要注意的是,Objects.equals 方法依赖于被比较对象的 equals 方法实现。如果对象的类没有正确实现 equals 方法,可能会产生不符合预期的结果。

例如:

public class ObjectsDemo1 {public static void main(String[] args) {Person person1 = new Person("沉默王二", 18);Person person2 = new Person("沉默王二", 18);System.out.println(Objects.equals(person1, person2)); // 输出:false}
}class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}
}

在这个例子中,Person 类没有重写 equals 方法,因此默认使用 Object 类的 equals 方法,只比较对象引用是否相同。为了解决这个问题,我们需要在 Person 类中重写 equals 方法:

@Override
public boolean equals(Object obj) {if (this == obj) {return true;}if (obj == null || getClass() != obj.getClass()) {return false;}Person person = (Person) obj;return age == person.age && Objects.equals(name, person.name);
}

5 获取对象的 hashCode

Objects 类提供了 hashCode 方法,用于获取对象的 hashCode

String str = new String("沉默王二");
System.out.println(Objects.hashCode(str));  // 输出:867758096

6 比较两个对象

compare 方法用于比较两个对象,通常用于自定义排序。它需要一个比较器(Comparator)作为参数。如果比较器为 null,则使用自然顺序。

示例代码:

class ObjectsCompareDemo {public static void main(String[] args) {PersonCompare person1 = new PersonCompare("itwanger", 30);PersonCompare person2 = new PersonCompare("chenqingyang", 25);Comparator<PersonCompare> ageComparator = Comparator.comparingInt(p -> p.age);int ageComparisonResult = Objects.compare(person1, person2, ageComparator);System.out.println("年龄排序: " + ageComparisonResult); // 输出:1(表示 person1 的 age 在 person2 之后)}
}class PersonCompare {String name;int age;PersonCompare(String name, int age) {this.name = name;this.age = age;}
}

7 比较两个数组

deepEquals 方法用于比较两个数组类型的对象。当对象是非数组时,其行为与 equals 方法一致。

示例代码:

int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};
int[] array3 = {1, 2, 4};System.out.println(Objects.deepEquals(array1, array2)); // 输出:true
System.out.println(Objects.deepEquals(array1, array3)); // 输出:false// 对于非数组对象,deepEquals() 的行为与 equals() 相同
String string1 = "hello";
String string2 = "hello";
String string3 = "world";System.out.println(Objects.deepEquals(string1, string2)); // 输出:true
System.out.println(Objects.deepEquals(string1, string3)); // 输出:false

对于二维数组的比较:

String[][] nestedArray1 = {{"A", "B"}, {"C", "D"}};
String[][] nestedArray2 = {{"A", "B"}, {"C", "D"}};
String[][] nestedArray3 = {{"A", "B"}, {"C", "E"}};System.out.println(Objects.deepEquals(nestedArray1, nestedArray2)); // 输出:true
System.out.println(Objects.deepEquals(nestedArray1, nestedArray3)); // 输出:false

7 小结

除了上述方法,Objects 类还提供了其他一些实用的方法,如 toString 等。这些方法在许多情况下非常有用,可以简化代码并减少出错的可能性。

总之,Objects 类提供的这些方法在处理对象时非常有用,能够帮助开发者更安全、更高效地编写代码。

8 思维导图

在这里插入图片描述

9 参考链接

Objects:专为操作Java对象而生的工具类

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

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

相关文章

InnoDB存储引擎

6.1 逻辑存储结构 InnoDB的逻辑存储结构如下图所示: 6.2 架构 6.2.1 概述 MySQL5.5 版本开始&#xff0c;默认使用InnoDB存储引擎&#xff0c;它擅长事务处理&#xff0c;具有崩溃恢复特性&#xff0c;在日常开发中使用非常广泛。下面是InnoDB架构图&#xff0c;左侧为内存结…

如何使用.bat实现快速电脑关机?

1、在电脑桌面新建一个记事本文档&#xff0c;将如下内容写进去&#xff1a; echo off shutdown /s /t 02、然后&#xff0c;保存一下&#xff0c;再把桌面此文件重命名为电脑关机.bat 3、双击此程序&#xff0c;可以立刻关机电脑。 PS&#xff1a;① 此程序会不保存任何当前…

表的设计(MYSQL)

表的设计方法 范式 第一范式 第二范式 第三范式 实现方式 程序实现

【再谈设计模式】抽象工厂模式~对象创建的统筹者

一、引言 在软件开发的世界里&#xff0c;高效、灵活且易于维护的代码结构是每个开发者追求的目标。设计模式就像是建筑蓝图中的经典方案&#xff0c;为我们提供了应对各种常见问题的有效策略。其中&#xff0c;抽象工厂模式在对象创建方面扮演着重要的角色&#xff0c;它如同一…

R语言机器学习与临床预测模型77--机器学习预测常用R语言包

R小盐准备介绍R语言机器学习与预测模型的学习笔记 你想要的R语言学习资料都在这里&#xff0c; 快来收藏关注【科研私家菜】 01 预测模型常用R包 常见回归分析包: rpart 包含有分类回归树的方法; earth 包可以实现多元自适应样条回归; mgev包含广义加性模型回归; Rweka 包中的M…

使用OpenGL ES简单实现一个特效

玩抖音的时候&#xff0c;刷到一个抖音红发GET特效&#xff0c;感觉实现起来应该不太难。 于是小试牛刀。以刷到的一个视频一帧为原图 抖音红发GET特效拍出来的效果为 我实现的效果为&#xff1a; 基于Android平台&#xff0c;以OpenGL ES为工具&#xff0c;开发了一个滤镜…

豆包MarsCode算法题:数组元素之和最小化

数组元素之和最小化 问题描述思路分析分析思路解决方案 参考代码&#xff08;Python&#xff09;代码分析1. solution 函数2. 计算 1 2 3 ... n 的和3. 乘以 k 得到最终的数组元素之和4. 主程序&#xff08;if __name__ __main__:&#xff09;代码的时间复杂度分析&#x…

WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇

WebRTC视频 01 - 视频采集整体架构 WebRTC视频 02 - 视频采集类 VideoCaptureModule WebRTC视频 03 - 视频采集类 VideoCaptureDS 上篇 WebRTC视频 04 - 视频采集类 VideoCaptureDS 中篇 WebRTC视频 05 - 视频采集类 VideoCaptureDS 下篇&#xff08;本文&#xff09; 一、前言…

ffmpeg 最强大的视频工具

文章目录 一、ffmpeg安装二、基本用法1、文件格式转换2、视频过滤器 filter3、剪切4、合并5、音频过滤器6、删除轨道7、简单应用&#xff1a;录屏 一、ffmpeg安装 windows下可以上官网 https://www.ffmpeg.org/download.html下载&#xff1a; 下载好后&#xff0c;解压缩&…

初识算法 · 位运算(2)

目录 前言&#xff1a; 判定字符是否唯一 丢失的数字 比特位计数 只出现一次的数字III 前言&#xff1a; ​本文的主题是位运算&#xff0c;通过四道题目讲解&#xff0c;一道是判断字符是否唯一&#xff0c;一道是只出现一次的数字III&#xff0c;一道是比特位计数&…

大数据新视界 -- 大数据大厂之 Impala 性能优化:基于数据特征的存储格式选择(上)(19/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

[产品管理-76]:延续是创新与颠覆式创新的比较

目录 一、概述 1、定义与特征 2、市场影响与竞争策略 3、实施难度与风险 4、案例分析 二、示例 1. 延续性创新示例 2. 创新示例 3. 颠覆式创新示例 一、概述 延续性创新与颠覆式创新是技术创新领域的两种重要策略&#xff0c;它们在多个方面存在显著差异。 以下是对…

JAVA学习日记(十五) 数据结构

一、数据结构概述 数据结构是计算机底层存储、组织数据的方式。 数据结构是指数据相互之间以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据&#xff0c;需要结合具体的业务场景来进行选择。 二、常见的数据结构 &#xff08;一&#xff09;栈 特点&…

自动化测试工具Ranorex Studio(三十)-代码模块中使用变量快照

为了在代码模块中使用数据连接器提供的值&#xff0c;你需要在代码中添加一个变量。使用右键菜单项’Insert Module Variable’。 添加一个新的变量到您的代码模块 指定变量名和默认值 通过添加一个新的变量&#xff0c;Ranorex Studio 会在光标位置插入一段新代码——由一个…

Python技巧:查询模块的版本号的方法

1,pycharm里面的 Python interpreter 或者 Python package 2&#xff0c;通过 __version_info__ import matplotlib print(matplotlib.__version_info__) 3&#xff0c;查看目录里面的 _version.py 文件

​​​​​​​15TS Series TVS 的解析

15TS Series 1500W Transient Voltage Suppresso指的是一系列高性能的瞬态电压抑制二极管&#xff08;Transient Voltage Suppressor&#xff0c;TVS&#xff09;&#xff0c;这些二极管由时源芯微&#xff08;TimeSource&#xff09;设计用于保护敏感的电子设备免受瞬态过电压…

Python学习从0到1 day27 Python 高阶技巧 ① 闭包

目录 一、闭包 作用 示例 二、nonlocal关键字 示例 三、atm取钱的闭包实现 四、闭包注意事项 优点 缺点 我陪你走了一段路&#xff0c;你最了解我不是吗 —— 24.11.11 一、闭包 在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部…

python成长技能之网络编程

文章目录 一、初识Socket1.1 什么是 Socket?1.2 socket的基本操作1.3 socket常用函数 二、基于UDP实现客户端与服务端通信三、基于TCP实现客户端与服务端通信四、使用requests模块发送http请求 一、初识Socket 1.1 什么是 Socket? Socket又称"套接字"&#xff0c;…

[ACTF2020 新生赛]Upload 1--详细解析

信息收集 题目告诉我们是一道upload&#xff0c;也就是文件上传漏洞题目。 进入界面&#xff0c;是一个灯泡&#xff0c;将鼠标放在图标上就会出现文件上传的相应位置&#xff1a; 思路 文件上传漏洞&#xff0c;先看看有没有前端校验。 在js源码中找到了前端校验&#xff…

光伏设计软件怎么选?有哪些推荐?

在光伏电站的开发建设中&#xff0c;专业设计软件是提升电站能效、降低开发成本的重要工具。市场上存在许多优秀的光伏设计软件&#xff0c;能够通过还原现状和三维建模来呈现出最符合实际需求的设计方案&#xff0c;究竟该怎么选呢&#xff1f; -易用性&#xff1a;一些软件操…