1. 程式人生 > WINDOWS開發 >常用API - Arrays、Math、Object

常用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 val) 將指定的 int 值分配給指定 int 型陣列指定範圍中的每個元素。
static void sort(int[] a) 對指定的 int 型陣列按數字升序進行排序。
static void sort(int[] a,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,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方法返回該物件的字串表示,其實該字串內容就是物件的型別[email protected]+記憶體地址值。

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));
}