4.3java工具类Objects,Arrays
Java中的
Objects
和Arrays
类是java.util
包下的实用工具类,分别用于操作对象和数组。Objects
类提供了检查对象是否为null
、比较对象等方法,如isNull
、nonNull
、requireNonNull
和equals
。Arrays
类则提供了数组的排序、查找、填充等功能,如sort
、binarySearch
、fill
和toString
。此外,Arrays
类还支持对自定义类型进行排序,通过实现Comparable
接口或使用Comparator
接口。这些工具类简化了Java编程中的常见操作,提高了代码的效率和可读性。
在 Java 中,Objects
和 Arrays
是 java.util
包下非常实用的工具类,分别提供了操作对象和数组的静态方法。
Objects
类
Objects
类包含了一系列用于操作对象的静态方法,主要用于检查对象是否为 null
、比较对象等,它在 Java 7 中被引入。
常用方法及示例
1. isNull(Object obj)
和 nonNull(Object obj)
- 功能:
isNull
用于判断对象是否为null
,nonNull
用于判断对象是否不为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()
:用于返回一个数的绝对值,该方法有多种重载形式,可处理int
、long
、float
和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()
:返回两个数中的最大值,有int
、long
、float
和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));}
}