常用API - Arrays、Math、Object
Arrays类
概述
此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。
除非特别注明,否则如果指定数组引用为 null,则此类中的方法都会抛出 NullPointerException
。
此类的方法都是静态方法,通过类名直接调用。
静态方法
方法摘要 | 描述 |
---|---|
static <T> List<T> asList(T... a) |
返回一个受指定数组支持的固定大小的列表。 |
static int binarySearch(int[] a, int key) | 使用二分搜索法来搜索指定的 int 型数组,以获得指定的值。 |
static int binarySearch(int[] a, int fromIndex, int toIndex, int key) | 使用二分搜索法来搜索指定的 int 型数组的范围,以获得指定的值。 |
static int[] copyOf(int[] original, int newLength) | 复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。 |
static int[] copyOfRange(int[] original, int from, int to) | 将指定数组的指定范围复制到一个新数组。 |
static boolean equals(int[] a, int[] a2) | 如果两个指定的 int 型数组彼此相等,则返回 true。 |
static void fill(int[] a, int val) | 将指定的 int 值分配给指定 int 型数组的每个元素。 |
static void fill(int[] a, int fromIndex, int toIndex, int val) | 将指定的 int 值分配给指定 int 型数组指定范围中的每个元素。 |
static void sort(int[] a) | 对指定的 int 型数组按数字升序进行排序。 |
static void sort(int[] a, int fromIndex, int toIndex) | 对指定 int 型数组的指定范围按数字升序进行排序。 |
static String toString(int[] a) | 返回指定数组内容的字符串表示形式。 |
static boolean deepEquals(Object[] a1, Object[] a2) | 如果两个指定数组彼此是深层相等 的,则返回 true。 |
static int deepHashCode(Object[] a) | 基于指定数组的“深层内容”返回哈希码。 |
static String deepToString(Object[] a) | 返回指定数组“深层内容”的字符串表示形式。 |
static |
根据指定比较器产生的顺序对指定对象数组进行排序。 |
static |
根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。 |
以上方法以int类型为例,其他的基本数据类型也有相应的重载方法。
练习
常用的方法
package com;
import java.util.Arrays;
public class ArraysTest {
public static void main(String[] args) {
int[] nums = {1, 3, 5, 4, 2};
System.out.println("工具类输出" + Arrays.toString(nums));
Arrays.sort(nums);
System.out.println("排序后输出" + Arrays.toString(nums));
}
}
package com.practise;
import java.util.Arrays;
/**
* 请使用Arrays相关API,讲一个随机字符串的所有字符升序排序,
* 并倒序打印 (倒序 forr)
*/
public class ArraysPractise {
public static void main(String[] args) {
String str = "dqwtjzfdas4523aklo";
char[] chars = str.toCharArray();
Arrays.sort(chars);
for (int i = chars.length - 1; i >= 0; i--) {
System.out.print(chars[i] + "\t");
}
}
}
Math类
概述
java.lang.Math
类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
字段摘要
字段摘要 | |
---|---|
static double E | 比任何其他值都更接近 e(即自然对数的底数)的 double 值 |
static double PI | 比任何其他值都更接近 pi(即圆的周长与直径之比)的 double 值。 |
静态方法
方法摘要 | 描述 |
---|---|
static int abs(int a) | 返回 int 值的绝对值。 (long/float/double) |
static int max(int a, int b) | 返回两个 int 值中较大的一个。(long/float/double) |
static int min(int a, int b) | 返回两个 int 值中较小的一个。(long/float/double) |
static double ceil(double a) | 返回一个大于等于参数的最小double 值,并等于某个整数。 向上取整! |
static double floor(double a) | 返回一个小于等于参数的最大double 值,并等于某个整数。向下取整! |
static int round(float a) | 返回最接近参数的 int 四舍五入!。 |
static long round(double a) | 返回最接近参数的 long。 |
static double random() | 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。 |
static double pow(double a, double b) | 返回第一个参数的第二个参数次幂的值。 |
static double sqrt(double a) | 返回正确舍入的 double 值的正平方根。 |
static double cbrt(double a) | 返回 double 值的立方根。 |
其他方法
方法摘要 | 描述 |
---|---|
static double copySign(double magnitude, double sign) | 返回带有第二个浮点参数符号的第一个浮点参数。 |
static float copySign(float magnitude, float sign) | 返回带有第二个浮点参数符号的第一个浮点参数。 |
static double cos(double a) | 返回角的三角余弦。 |
static double cosh(double x) | 返回 double 值的双曲线余弦。 |
static double exp(double a) | 返回欧拉数 e 的 double 次幂的值。 |
static double expm1(double x) | 返回 ex -1。 |
static int getExponent(double d) | 返回 double 表示形式中使用的无偏指数。 |
static int getExponent(float f) | 返回 float 表示形式中使用的无偏指数。 |
static double hypot(double x, double y) | 返回 sqrt(x2 +y2),没有中间溢出或下溢。 |
static double IEEEremainder(double f1, double f2) | 按照 IEEE 754 标准的规定,对两个参数进行余数运算。 |
static double log(double a) | 返回 double 值的自然对数(底数是 e)。 |
static double log10(double a) | 返回 double 值的底数为 10 的对数。 |
static double log1p(double x) | 返回参数与 1 之和的自然对数。 |
static double nextAfter(double start, double direction) | 返回第一个参数和第二个参数之间与第一个参数相邻的浮点数。 |
static float nextAfter(float start, double direction) | 返回第一个参数和第二个参数之间与第一个参数相邻的浮点数。 |
static double nextUp(double d) | 返回 d 和正无穷大之间与 d 相邻的浮点值。 |
static float nextUp(float f) | 返回 f 和正无穷大之间与 f 相邻的浮点值。 |
static double rint(double a) | 返回最接近参数并等于某一整数的 double 值。 |
static double scalb(double d, int scaleFactor) | 返回 d × 2scaleFactor,其舍入方式如同将一个正确舍入的浮点值乘以 double 值集合中的一个值。 |
static float scalb(float f, int scaleFactor) | 返回 f × 2scaleFactor,其舍入方式如同将一个正确舍入的浮点值乘以 float 值集合中的一个值。 |
static double signum(double d) | 返回参数的符号函数;如果参数为 0,则返回 0;如果参数大于 0,则返回 1.0;如果参数小于 0,则返回 -1.0。 |
static float signum(float f) | 返回参数的符号函数;如果参数为 0,则返回 0;如果参数大于 0,则返回 1.0;如果参数小于 0,则返回 -1.0。 |
static double sin(double a) | 返回角的三角正弦。 |
static double tan(double a) | 返回角的三角正切。 |
static double sinh(double x) | 返回 double 值的双曲线正弦。 |
static double tanh(double x) | 返回 double 值的双曲线余弦。 |
static double toDegrees(double angrad) | 将用弧度表示的角转换为近似相等的用角度表示的角。 |
static double toRadians(double angdeg) | 将用角度表示的角转换为近似相等的用弧度表示的角。 |
static double ulp(double d) | 返回参数的 ulp 大小。 |
static float ulp(float f) | 返回参数的 ulp 大小。 |
static double acos(double a) | 返回一个值的反余弦;返回的角度范围在 0.0 到 pi 之间。 |
static double asin(double a) | 返回一个值的反正弦;返回的角度范围在 -pi/2 到 pi/2 之间。 |
static double atan(double a) | 返回一个值的反正切;返回的角度范围在 -pi/2 到 pi/2 之间。 |
static double atan2(double y, double x) | 将矩形坐标 (x, y) 转换成极坐标 (r, theta),返回所得角 theta。 |
练习
package com;
import org.opencv.core.Mat;
/**
* Math 类常用的4+1
* abs ceil floor round
*/
public class MathTest {
public static void main(String[] args) {
// 绝对值 (int/long/float/double)
System.out.println(Math.abs(1.11));
System.out.println(Math.abs(-1.11));
System.out.println("===========");
// 向上取整 只能double
System.out.println(Math.ceil(1.0));
System.out.println(Math.ceil(1.4));
System.out.println(Math.ceil(1.6));
System.out.println(Math.ceil(2.0));
System.out.println("===========");
// 向下取整 只能double
System.out.println(Math.floor(1.0));
System.out.println(Math.floor(1.4));
System.out.println(Math.floor(1.6));
System.out.println(Math.floor(2.0));
System.out.println("===========");
// 四舍五入 float -> int , double -> long
System.out.println(Math.round(1.0));
System.out.println(Math.round(1.4));
System.out.println(Math.round(1.6));
System.out.println(Math.round(2.0));
System.out.println("===========");
// 字段
System.out.println(Math.PI);
System.out.println(Math.E);
}
}
结果
1.11
1.11
===========
1.0
2.0
2.0
2.0
===========
1.0
1.0
1.0
2.0
===========
1
1
2
2
===========
3.141592653589793
2.718281828459045
package com.practise;
import java.util.Arrays;
/**
* 计算再-10.8到5.9之间绝对值大于6或者小于2.1的整数有多少个?
*/
public class MathPractise {
public static void main(String[] args) {
double left = -10.8;
double right = 5.9;
int count = 0;
for (int i = (int)left; i <= (int)right; i++) {
int temp = Math.abs(i);
if (temp > 6 || temp < 2.1) {
count++;
}
}
System.out.println("符合的有"+count+"个");
}
}
Object类
概述
java.lang.Object
类是Java语言中的根类,即所有类的父类。它的所有方法子类都可以使用。
在对象实例化的时候,最终找的父类就是Object。
如果一个类没有特别指定父类, 那么默认则继承自Object类。例如:
public class MyClass /*extends Object*/ {
// ...
}
根据JDK源代码及Object类的API文档,Object类当中包含的方法有11个。今天我们主要学习其中的2个:
public String toString()
:返回该对象的字符串表示。public boolean equals(Object obj)
:指示其他某个对象是否与此对象“相等”。
toString方法
方法摘要
public String toString()
:返回该对象的字符串表示。
toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
重写toString方法
如果不希望使用toString方法的默认行为,则可以对它进行覆盖重写。例如自定义的Person类:
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
// 省略构造器与Getter Setter
}
在IntelliJ IDEA中,可以点击Code
菜单中的Generate...
,也可以使用快捷键alt+insert
,点击toString()
选项。
选择需要包含的成员变量并确定。
小贴士: 在我们直接使用输出语句输出对象名的时候,其实通过该对象调用了其toString()方法。
equals方法
方法摘要
public boolean equals(Object obj)
:指示其他某个对象是否与此对象“相等”。
调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。
默认地址比较
如果没有覆盖重写equals方法,那么Object类中默认进行==
运算符的对象地址比较,只要不是同一个对象,结果必然为false。+
public boolean equals(Object obj) {
return (this == obj);
}
==
-
基本类型,两值相等返回true
-
引用类型,两地址相等返回true
重写equals方法
对象内容比较
如果希望进行对象的内容比较,即所有或指定的部分成员变量相同就判定两个对象相同,则可以覆盖重写equals方法。例如:
import java.util.Objects;
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
// 如果对象地址一样,则认为相同
if (this == o)
return true;
// 如果参数为空,或者类型信息不一样,则认为不同
if (o == null || getClass() != o.getClass())
return false;
// 转换为当前类型
Person person = (Person) o;
// 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果
return age == person.age && Objects.equals(name, person.name);
}
}
这段代码充分考虑了对象为空、类型一致等问题,但方法内容并不唯一。大多数IDE都可以自动生成equals方法的代码内容。
在IntelliJ IDEA中,可以使用Code
菜单中的Generate…
选项,也可以使用快捷键alt+insert
,
并选择equals() and hashCode()
进行自动代码生成。
tips:Object类当中的hashCode等其他方法,今后学习。
Objects类
在刚才IDEA自动重写equals代码中,使用到了java.util.Objects
类,那么这个类是什么呢?
在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,
这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),
用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。方法如下:
public static boolean equals(Object a, Object b)
:判断两个对象是否相等。
我们可以查看一下源码,学习一下:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}