常用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 |
返回指定陣列內容的字串表示形式。 |
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方法返回該物件的字串表示,其實該字串內容就是物件的型別[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));
}