小白學java——Objects類的方法總結
Objects 14種方法
用於計算物件的雜湊程式碼,返回物件的字串,比較兩個物件,以及檢查索引或子範圍值是否超出範圍
範圍檢查 (返回int)
1.Objects.checkFromIndexSize(int fromIndex,int size,int length)
inta= Objects.checkFromIndexSize(4, 8, 12);
System.out.println(a);
結果為:4
inta= Objects.checkFromIndexSize(4, 8, 11);
System.out.println(a);
結果為:Range [4, 4 + 8) out of bounds for length 11
檢查是否在子範圍從 fromIndex(包括)到 fromIndex + size(不包括)是範圍界限內 0(包括)到 length(不包括)。
2.Objects.checkFromToIndex(intfromIndex, inttoIndex, intlength)
檢查是否在子範圍從 fromIndex(包括)到 toIndex(不包括)是範圍界限內 0(包括)到 length(不包括)。
3.Objects.checkIndex(intindex, intlength)
檢查 index是否在 0(含)到 length(不包括)範圍內。
兩個物件作比較
1.public static <T>int compare
此方法用於比較a,b兩個物件如果a,b兩個物件指向同一引用地址,返回0;否則呼叫c的compare方法進行比較,c的compare方法中傳入的兩個引數就分別是a,b。原始碼:
public static <T> int compare(T a, T b, Comparator<? super T> c) {
return (a == b) ? 0 : c.compare(a, b);
}
測試程式碼:
public class Demo1 implements Comparator<Demo1> {
private String data;
public Demo1() {
}
public Demo1(String data) {
this.data = data;
}
public static void main(String[] args) {
Demo1 test1 = new Demo1("測試程式碼
Demo1 test2 = new Demo1("測試程式碼Test2");
Demo1 test3 = new Demo1("測試程式碼Test1");
int a = Objects.compare(test1, test1, new Demo1());
System.out.println(a);
int b = Objects.compare(test1, test3, new Demo1());
System.out.println(b);
int c = Objects.compare(test1, test2, new Demo1());
System.out.println(c);
}
@Override
public int compare(Demo1 o1, Demo1 o2) {
if (o1.data == o2.data)
return 1;
return 2;
}
}
輸出:012
2.public static boolean deepEquals(Object a, Object b)
此方法用於比較a,b兩個物件是否深度相等,為什麼要叫深度相等?因為a,b兩個物件都可以為陣列。由於Java中Object類是一切類的基類,所以Object o = new Object[10]的程式碼是被允許的。所以傳入的物件可以是一個數組。如果傳入的物件是陣列,要比較兩個物件是否深度相等,就要比較兩個陣列對應下標的元素是否都相等。如果傳入的物件有一個不是陣列,就直接呼叫a物件的equals方法傳入b物件比較兩物件是否相等。下面我們來看下原始碼:
public static boolean deepEquals(Object a, Object b) {
//如果a和b指向同一地址,則a和b是同一物件,返回true。
if (a == b)
return true;
//如果a或b中有一物件為空,則a和b不是同一型別物件,返回false。這樣也避免了當a為空或者b為空時呼叫equals方法造成的空指標引用異常。
else if (a == null || b == null)
return false;
//否則,呼叫Arrays類的deepEquals0方法對a,b進行深度比較。
else
return Arrays.deepEquals0(a, b);
}
我們跳到Arrays類的deepEquals0方法進行分析,雖然有很多的判斷語句,但是邏輯基本相同,我們就分析其中幾個:
static boolean deepEquals0(Object e1, Object e2) {
//因為之後要呼叫e1的equals方法,所以e1不能為空。
assert e1 != null;
//定義返回值。
boolean eq;
//這個if是用於判斷引用資料型別陣列的,如果e1,e2都是引用資料型別陣列的話,就呼叫Arrays類的deepEquals方法判斷兩陣列是否相等。之後的基本資料型別的判斷流程也一樣。
if (e1 instanceof Object[] && e2 instanceof Object[])
eq = deepEquals ((Object[]) e1, (Object[]) e2);
else if (e1 instanceof byte[] && e2 instanceof byte[])
eq = equals((byte[]) e1, (byte[]) e2);
else if (e1 instanceof short[] && e2 instanceof short[])
eq = equals((short[]) e1, (short[]) e2);
else if (e1 instanceof int[] && e2 instanceof int[])
eq = equals((int[]) e1, (int[]) e2);
else if (e1 instanceof long[] && e2 instanceof long[])
eq = equals((long[]) e1, (long[]) e2);
else if (e1 instanceof char[] && e2 instanceof char[])
eq = equals((char[]) e1, (char[]) e2);
else if (e1 instanceof float[] && e2 instanceof float[])
eq = equals((float[]) e1, (float[]) e2);
else if (e1 instanceof double[] && e2 instanceof double[])
eq = equals((double[]) e1, (double[]) e2);
else if (e1 instanceof boolean[] && e2 instanceof boolean[])
eq = equals((boolean[]) e1, (boolean[]) e2);
//如果e1和e2不全為陣列,就呼叫e1的equals方法。
else
eq = e1.equals(e2);
//返回判斷的結果。
return eq;
}
3.public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
返回 true如果引數相等,彼此 false其他,相比於物件直接呼叫equals避免了空指標異常的現象
判斷傳入引數是否為空
1.public static boolean isNull(Object obj) {
return obj == null;
}
返回 true則是null ,否則返回 false 物件建立時有了引用地址就不為空,除非給它賦值NULL
2.public static boolean nonNull(Object obj) {
return obj != null;
}
返回 true則是非空, null返回 false
3.public static <T> TrequireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
檢查指定的物件引用是否為null ,是則丟擲異常
4.public static<T> TrequireNonNull(T obj, String message) {
if(obj== null)
throw newNullPointerException(message);
return obj;
}
檢查指定的物件引用是否為null,如果是,則丟擲自定義的NullPointerException
5.public static<T> TrequireNonNull(Tobj, Supplier<String> messageSupplier) {
if (obj == null)
throw new NullPointerException(messageSupplier == null ?
null : messageSupplier.get());
return obj;
}
檢查指定的物件引用是否為null,如果是,則丟擲自定義的NullPointerException
6.public static <T> TrequireNonNullElse(Tobj, TdefaultObj) {
return (obj != null) ? obj : requireNonNull(defaultObj, "defaultObj");
}
如果它是非 null,則返回第一個引數,否則返回非 null第二個引數
直接返回呼叫的結果toString
1.public static String toString(Object o) {
return String.valueOf(o);
}
返回呼叫的結果 toString對於非 null引數輸出哈係數(Person@2d363fb3), "null"則直接輸出null
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
2.public static String toString(Object o, String nullDefault) {
return (o != null) ? o.toString() : nullDefault;
}
如果第一個引數不是 null,則返回在第一個引數上呼叫 toString的結果,否則返回第二個引數