常用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 void sort(T[] a, Comparator<? super T> c) 根据指定比较器产生的顺序对指定对象数组进行排序。
static void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c) 根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。

以上方法以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));
}

常用API - Arrays、Math、Object

上一篇:ORACLE 创建表空间、用户、授权


下一篇:C# Array类的Sort()方法