寫在前面
要想成為一個優秀的Java工程師,會看源碼是不可或缺的必備技能。在IDEA裡,Ctrl+滑鼠左鍵就可以看到類的源碼。同樣的,也要熟悉Java的API文檔。這裡簡單的介紹一些Java類庫及其常用的方法,會根據我自己的學習進度進行不定時更新。
java.util.Objects
我們知道 java.lang.Object 是類層次的根,所有類的基類,即所有類都繼承自Object。這裡我們介紹的是 java.util.Objects 類。
此類包含static實用程式方法,用于操作對象或在操作前檢查某些條件。 這些實用程式包括null或null方法,用于計算對象的哈希代碼,傳回對象的字元串,比較兩個對象,以及檢查索引或子範圍值是否超出範圍。
-
Objects.equals
equals(Object a, Object b) 如果參數相等,傳回true;其他則傳回false。 是以,如果這兩個參數是null , 傳回true,如果隻有一個參數為null,傳回false。如果二者都不為空,通過使用第一個參數的equals方法确定相等性。
觀察下面的代碼
String s1 = "123";
String s2 = "456";
System.out.println(s1.equals(s2));
這樣寫當然沒有問題,但是考慮傳參時,有可能傳過來null,即
String s1 = null;
String s2 = "456";
System.out.println(s1.equals(s2));
這樣會産生空指針異常,因為一個空的null不能調取方法。如果使用Objects類的方法,就不會産生異常。
String s1 = null;
String s2 = "456";
System.out.println(Objects.equals(p1, p2));
我們來看Objects類equals方法的源碼。
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
a == b 比較的是兩個對象的記憶體位址,如果記憶體位址相同,即同一個對象,傳回true;(a != null && a.equals(b) 這段代碼是先判斷a不為空,a不為空後再調用基類Object的equals方法,就不會出現空指針異常了。
-
Objects.checkFromIndexSize(int fromIndex, int size, int length)
檢查是否在子範圍從 fromIndex (包括)到 fromIndex + size (不包括)是範圍界限内 0 (包括)到 length(不包括)。( java裡常用包括上界,不包括下界的區間)源碼為
public static
int checkFromIndexSize(int fromIndex, int size, int length) {
return Preconditions.checkFromIndexSize(fromIndex, size, length, null);
}
-
Objects.isNull(Object obj)
空則傳回true,不空傳回false。源碼為
public static boolean isNull(Object obj) {
return obj == null;
}
-
Objects.nonNull(Object obj)
不空則傳回true,空傳回false。源碼為
public static boolean nonNull(Object obj) {
return obj != null;
}
-
Objects.requireNonNull(T obj)
如果傳參為空,直接抛出異常。當我們需要判斷傳過來的對象必須不能為空時,可以使用這個方法,調用方法的程式如果不處理異常,程式就會中斷。源碼為
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
java.lang.Math
類Math包含用于執行基本數字運算的方法,例如基本指數,對數,平方根和三角函數。
-
public static double abs(int a)
該方法為求絕對值,重載了int,float,double,long等基本資料類型。
-
public static double min(int a, int b)
該方法傳回兩數種較小的一個,同樣有重載方法。
-
public static int min(int a, int b)
該方法傳回兩數種較大的一個,同樣有重載方法。
-
public static long round(double a)
該方法傳回四舍五入後的值,1.5結果為2,-1.5四舍五入後為-1。
-
public static double floor(double a)
傳回小于或等于參數且等于數學整數的最大值,1.5結果為1,-1.5結果為-2
-
public static double ceil(double a)
傳回大于或等于參數且等于數學整數的最小值,1.2結果為2,-1.2結果為-1
java.util.Arrays
該類包含用于操作數組的各種方法(例如排序和搜尋)。 此類還包含一個靜态工廠,允許将數組視為清單。
-
static int binarySearch(int[] a, int fromIndex, int toIndex, int key)
使用二進制搜尋算法搜尋指定值的指定數組的範圍,有重載。
-
static int binarySearch(int[] a, int key)
使用二進制搜尋算法在指定的int數組中搜尋指定的值,有重載。
-
static int compare(boolean[] a, boolean[] b)
boolean字典順序比較兩個 boolean陣列。
-
static void sort(Object[] a)
根據元素的natural ordering ,将指定的對象數組按升序排序。
-
static void sort(Object[] a, int fromIndex, int toIndex)
根據元素的natural ordering ,将指定對象數組的指定範圍按升序排序。
-
static String toString(double[] a)
傳回指定數組内容的字元串表示形式。
-
static int mismatch(double[] a, double[] b)
查找并傳回兩個 double數組之間第一個不比對的索引,否則如果未找到不比對則傳回-1。
-
static boolean equals(int[] a, int[] a2)
如果兩個指定的int數組彼此 相等 ,則傳回 true 。
-
static double[] copyOf(double[] original, int newLength)
實作數組的動态擴容,傳入原數組和新長度,即可擴容。如下代碼塊,數組長度已經更改為15。
int arr[] = {1,2,3,4,5};
arr = Arrays.copyOf(arr, 15);
arr[6] = 1;
System.out.println(arr.length);
java.math.BigDecimal
在寫一些簡單的程式的時候,你是否會有這樣的疑問。
輸出結果毫無疑問應當是0.3,但是其實是…
在java中,如果使用double float等基本資料類型進行運算時,運算的結果會失去一些精準。當我們想做一個金融方面的程式時,這樣小的誤差積累起來會導緻結果錯誤。BigDecimal類可以解決小數誤差問題。來看一下這個類的使用方法吧。
public class Demo1 {
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");
BigDecimal b3 = b1.add(b2);
System.out.println(b3);
}
}
需要注意以下幾點
- 建立對象時傳入的時字元串類型
- add subtract multiply divide分别表示加減乘除方法,這些方法傳回的也是一個BigDecimal對象,參與運算的對象不會發生變化
- 可以使用 intValue doubleValue 等方法,傳回基本資料類型。
java.lang.System
對于這個類我們并不陌生,System類提供的方法包括标準輸入,标準輸出和錯誤輸出流; 通路外部定義的屬性和環境變量; 加載檔案和庫的方法; 以及用于快速複制陣列的一部分的實用方法。
- static PrintStream err “标準”錯誤輸出流。
- static InputStream in “标準”輸入流。
- static PrintStream out “标準”輸出流。
-
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
将指定源數組中的數組從指定位置開始複制到目标數組的指定位置。
-
static void gc()
運作垃圾回收器。