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

4.3java工具类Objects,Arrays

Java中的ObjectsArrays类是java.util包下的实用工具类,分别用于操作对象和数组。Objects类提供了检查对象是否为null、比较对象等方法,如isNullnonNullrequireNonNullequalsArrays类则提供了数组的排序、查找、填充等功能,如sortbinarySearchfilltoString。此外,Arrays类还支持对自定义类型进行排序,通过实现Comparable接口或使用Comparator接口。这些工具类简化了Java编程中的常见操作,提高了代码的效率和可读性。

 在 Java 中,Objects 和 Arrays 是 java.util 包下非常实用的工具类,分别提供了操作对象和数组的静态方法。

Objects 类

Objects 类包含了一系列用于操作对象的静态方法,主要用于检查对象是否为 null、比较对象等,它在 Java 7 中被引入。

常用方法及示例
1. isNull(Object obj) 和 nonNull(Object obj)
  • 功能isNull 用于判断对象是否为 nullnonNull 用于判断对象是否不为 null
  • 示例
import java.util.Objects;public class ObjectsNullExample {public static void main(String[] args) {String str = null;System.out.println(Objects.isNull(str)); // 输出: trueSystem.out.println(Objects.nonNull(str)); // 输出: falsestr = "Hello";System.out.println(Objects.isNull(str)); // 输出: falseSystem.out.println(Objects.nonNull(str)); // 输出: true}
}
2. requireNonNull(Object obj) 和 requireNonNull(Object obj, String message)
  • 功能:用于检查对象是否为 null,如果为 null 则抛出 NullPointerException。后者可以自定义异常信息。
  • 示例
import java.util.Objects;public class ObjectsRequireNonNullExample {public static void main(String[] args) {String str = null;try {Objects.requireNonNull(str);} catch (NullPointerException e) {System.out.println("默认异常信息: " + e.getMessage());}try {Objects.requireNonNull(str, "传入的对象不能为 null");} catch (NullPointerException e) {System.out.println("自定义异常信息: " + e.getMessage());}}
}
3. equals(Object a, Object b)
  • 功能:用于比较两个对象是否相等,它会处理 null 的情况,避免 NullPointerException
  • 示例
import java.util.Objects;public class ObjectsEqualsExample {public static void main(String[] args) {String str1 = null;String str2 = null;System.out.println(Objects.equals(str1, str2)); // 输出: truestr1 = "Hello";str2 = "Hello";System.out.println(Objects.equals(str1, str2)); // 输出: truestr2 = "World";System.out.println(Objects.equals(str1, str2)); // 输出: false}
}
4. hash(Object... values)
  • 功能:用于为一组对象生成哈希码,常用于重写 hashCode 方法。
  • 示例
import java.util.Objects;class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}public class ObjectsHashExample {public static void main(String[] args) {Person person = new Person("Alice", 25);System.out.println(person.hashCode());}
}

Arrays 类

Arrays 类提供了一系列用于操作数组的静态方法,比如数组的排序、查找、填充等。

常用方法及示例
1. sort(type[] a) 和 sort(type[] a, int fromIndex, int toIndex)
  • 功能:对数组进行排序,前者对整个数组排序,后者对指定范围的数组元素排序。type 可以是基本数据类型或引用类型。
  • 示例
import java.util.Arrays;public class ArraysSortExample {public static void main(String[] args) {int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};Arrays.sort(arr);System.out.println(Arrays.toString(arr)); // 输出排序后的数组int[] arr2 = {3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5};Arrays.sort(arr2, 2, 5); // 对索引 2 到 4 的元素排序System.out.println(Arrays.toString(arr2));}
}

 当对自定义类型数据进行排序时,需要让自定义类实现 Comparable 接口或者使用 Comparator 接口

Comparable 接口

Comparable 接口定义了对象的自然排序规则。若要让自定义类支持自然排序,就需要实现 Comparable 接口并重写 compareTo 方法。

import java.util.Arrays;// 自定义类 Student,实现 Comparable 接口
class Student implements Comparable<Student> {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}// 重写 compareTo 方法,按照年龄进行排序@Overridepublic int compareTo(Student other) {return Integer.compare(this.age, other.age);}@Overridepublic String toString() {return "Student{name='" + name + "', age=" + age + "}";}
}public class ArraysSortComparableExample {public static void main(String[] args) {Student[] students = {new Student("Alice", 20),new Student("Bob", 18),new Student("Charlie", 22)};// 使用 Arrays.sort 对数组进行排序Arrays.sort(students);// 输出排序后的数组for (Student student : students) {System.out.println(student);}}
}
  • 实现 Comparable 接口Student 类实现了 Comparable<Student> 接口,这意味着 Student 对象可以进行比较。
  • 重写 compareTo 方法:在 compareTo 方法中,使用 Integer.compare 方法比较两个 Student 对象的年龄。如果当前对象的年龄小于参数对象的年龄,返回负数;如果相等,返回 0;如果大于,返回正数。
  • 调用 Arrays.sort 方法:直接调用 Arrays.sort(students) 对 Student 数组进行排序,排序依据是 compareTo 方法定义的规则。

Comparator 接口

Comparator 接口允许你定义多种不同的排序规则,而不需要修改自定义类的代码。可以通过创建一个实现 Comparator 接口的类或者使用 Lambda 表达式来实现。

使用匿名内部类实现 Comparator 接口
import java.util.Arrays;
import java.util.Comparator;class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Student{name='" + name + "', age=" + age + "}";}
}public class ArraysSortComparatorExample {public static void main(String[] args) {Student[] students = {new Student("Alice", 20),new Student("Bob", 18),new Student("Charlie", 22)};// 使用匿名内部类实现 Comparator 接口,按照年龄进行排序Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {return Integer.compare(s1.getAge(), s2.getAge());}});// 输出排序后的数组for (Student student : students) {System.out.println(student);}}
}
使用 Lambda 表达式实现 Comparator 接口
import java.util.Arrays;public class ArraysSortLambdaExample {public static void main(String[] args) {Student[] students = {     new Student("Bob", 18),new Student("Charlie", 22)new Student("Alice", 20),};// 使用 Lambda 表达式实现 Comparator 接口,按照姓名进行排序Arrays.sort(students, (s1, s2) -> s1.getName().compareTo(s2.getName()) );// 输出排序后的数组for (Student student : students) {System.out.println(student);}}
}

  • Comparator 接口Comparator 接口包含一个 compare 方法,用于比较两个对象的大小。
  • 匿名内部类:在 Arrays.sort 方法的第二个参数中,使用匿名内部类实现 Comparator 接口,并重写 compare 方法来定义排序规则。
  • Lambda 表达式:使用 Lambda 表达式可以更简洁地实现 Comparator 接口,避免了匿名内部类的繁琐语法。

  • 实现 Comparable 接口:适用于为自定义类定义单一的自然排序规则。
  • 使用 Comparator 接口:适用于需要定义多种排序规则或者不想修改自定义类代码的情况
2. binarySearch(type[] a, type key) 和 binarySearch(type[] a, int fromIndex, int toIndex, type key)
  • 功能:使用二分查找算法在数组中查找指定元素,前者查找整个数组,后者查找指定范围。数组必须是有序的,否则结果不确定。
  • 示例
import java.util.Arrays;public class ArraysBinarySearchExample {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5};int index = Arrays.binarySearch(arr, 3);System.out.println("元素 3 的索引: " + index);int index2 = Arrays.binarySearch(arr, 1, 4, 3);System.out.println("在索引 1 到 3 范围内元素 3 的索引: " + index2);}
}
3. equals(type[] a, type[] a2)
  • 功能:比较两个数组是否相等,会比较数组的长度和元素内容。
  • 示例
import java.util.Arrays;public class ArraysEqualsExample {public static void main(String[] args) {int[] arr1 = {1, 2, 3};int[] arr2 = {1, 2, 3};System.out.println(Arrays.equals(arr1, arr2)); // 输出: trueint[] arr3 = {1, 2, 4};System.out.println(Arrays.equals(arr1, arr3)); // 输出: false}
}
4. fill(type[] a, type val) 和 fill(type[] a, int fromIndex, int toIndex, type val)
  • 功能:将数组的所有元素或指定范围的元素填充为指定值。
  • 示例
import java.util.Arrays;public class ArraysFillExample {public static void main(String[] args) {int[] arr = new int[5];Arrays.fill(arr, 10);System.out.println(Arrays.toString(arr)); // 输出: [10, 10, 10, 10, 10]int[] arr2 = new int[5];Arrays.fill(arr2, 1, 3, 20);System.out.println(Arrays.toString(arr2)); // 输出: [0, 20, 20, 0, 0]}
}
5. toString(type[] a)
  • 功能:返回数组的字符串表示形式,方便打印数组内容。
  • 示例
import java.util.Arrays;public class ArraysToStringExample {public static void main(String[] args) {int[] arr = {1, 2, 3};System.out.println(Arrays.toString(arr)); // 输出: [1, 2, 3]}
}

Math类

在 Java 中,Math 类位于 java.lang 包下,它提供了一系列用于执行基本数学运算的静态方法和常量。由于 java.lang 包会被自动导入,所以在使用 Math 类时无需显式导入。

常量

Math 类包含两个常用的数学常量:

  • Math.PI:表示圆周率 π,其值约为 3.141592653589793。
  • Math.E:表示自然对数的底数 e,其值约为 2.718281828459045。

示例代码:

public class MathConstantsExample {public static void main(String[] args) {System.out.println("圆周率 PI 的值: " + Math.PI);System.out.println("自然对数的底数 E 的值: " + Math.E);}
}

常用方法

1. 绝对值相关方法
  • Math.abs():用于返回一个数的绝对值,该方法有多种重载形式,可处理 intlongfloat 和 double 类型的数据。
    示例代码:
public class MathAbsExample {public static void main(String[] args) {int num1 = -10;System.out.println("整数的绝对值: " + Math.abs(num1));double num2 = -3.14;System.out.println("双精度浮点数的绝对值: " + Math.abs(num2));}
}
2. 最大值和最小值相关方法
  • Math.max():返回两个数中的最大值,有 intlongfloat 和 double 类型的重载方法。
  • Math.min():返回两个数中的最小值,同样有多种重载形式。
    示例代码:
public class MathMaxMinExample {public static void main(String[] args) {int a = 10;int b = 20;System.out.println("最大值: " + Math.max(a, b));System.out.println("最小值: " + Math.min(a, b));}
}
3. 四舍五入相关方法
  • Math.round():用于对一个数进行四舍五入操作,有 int 和 long 类型的返回值,分别对应 float 和 double 类型的参数。
    示例代码:
public class MathRoundExample {public static void main(String[] args) {float num1 = 3.6f;System.out.println("单精度浮点数四舍五入结果: " + Math.round(num1));double num2 = 3.4;System.out.println("双精度浮点数四舍五入结果: " + Math.round(num2));}
}
4. 随机数相关方法
  • Math.random():返回一个大于等于 0.0 且小于 1.0 的随机 double 类型的数。
    示例代码:
public class MathRandomExample {public static void main(String[] args) {double randomNum = Math.random();System.out.println("随机数: " + randomNum);// 生成 1 到 10 之间的随机整数int randomInt = (int) (Math.random() * 10 + 1);System.out.println("1 到 10 之间的随机整数: " + randomInt);}
}
5. 幂运算和平方根相关方法
  • Math.pow(double a, double b):返回 a 的 b 次幂。
  • Math.sqrt(double a):返回 a 的平方根。
    示例代码:
public class MathPowSqrtExample {public static void main(String[] args) {double base = 2;double exponent = 3;System.out.println(base + " 的 " + exponent + " 次幂: " + Math.pow(base, exponent));double num = 25;System.out.println(num + " 的平方根: " + Math.sqrt(num));}
}
6. 三角函数相关方法
  • Math.sin(double a):返回角 a 的正弦值,a 为弧度。
  • Math.cos(double a):返回角 a 的余弦值。
  • Math.tan(double a):返回角 a 的正切值。
    示例代码:
public class MathTrigonometricExample {public static void main(String[] args) {double angle = Math.PI / 2;System.out.println("正弦值: " + Math.sin(angle));System.out.println("余弦值: " + Math.cos(angle));System.out.println("正切值: " + Math.tan(angle));}
}
7. 对数相关方法
  • Math.log(double a):返回 a 的自然对数(以 e 为底)。
  • Math.log10(double a):返回 a 的常用对数(以 10 为底)。
    示例代码:
public class MathLogExample {public static void main(String[] args) {double num = 10;System.out.println(num + " 的自然对数: " + Math.log(num));System.out.println(num + " 的常用对数: " + Math.log10(num));}
}

http://www.xdnf.cn/news/4986.html

相关文章:

  • PMIC电源管理模块的PCB设计
  • 124549-23-1,PBFI AM,测定细胞内区隔的钾离子水平变化
  • 全球实物文件粉碎服务市场洞察:合规驱动下的安全经济与绿色转型
  • 2022-2025年全国路网数据分享
  • C++AVL树
  • 计算机二级(C语言)已过
  • HarmonyOS开发-组件市场
  • 提升研发运维效能:Pacvue 泊客电商的 GenAI 技术实践
  • 从0开始学linux韦东山教程第一三章问题小结(1)
  • wsl - install RabbiqMQ
  • 2025数维杯数学建模C题完整分析参考论文(共36页)(含模型、可运行代码、数据)
  • 【Python】超全常用 conda 命令整理
  • 【深度学习新浪潮】智能追焦技术全解析:从算法到设备应用
  • MATLAB制作柱状图与条图:数据可视化的基础利器
  • Android 项目中配置了多个 maven 仓库,但依赖还是下载失败,除了使用代理,还有其他方法吗?
  • LLM 推理加速:深度解析 Prefilling 与 Decoding 阶段的优化秘籍
  • YOLOv1模型架构、损失值、NMS极大值抑制
  • 从设计到开发,原型标注图全流程标准化
  • 学习DLT698进阶二,电表的事件
  • 基于 Ubuntu 24.04 部署 WebDAV
  • window 显示驱动开发-配置内存段类型
  • Jenkins linux安装
  • 【一】浏览器的copy as fetch和copy as bash的区别
  • 解决:EnvironmentNameNotFound: Could not find conda environment?
  • 深入解析Docker底层原理:从Namespace到联合文件系统
  • 使用SVM进行图像分类
  • 每天五分钟深度学习框架pytorch:视觉工具包torchvison
  • 浏览器节能机制导致Websocket断连的坑
  • Python 爬虫基础入门教程(超详细)
  • 代发考试战报:思科华为HCIP HCSE CCNP 考试通过