1. 程式人生 > 其它 >小白學java——Objects類的方法總結

小白學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

(Ta,Tb, Comparator<? super T> c)

此方法用於比較ab兩個物件如果ab兩個物件指向同一引用地址,返回0;否則呼叫ccompare方法進行比較,ccompare方法中傳入的兩個引數就分別是ab原始碼:

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("測試程式碼

Test1");
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)

此方法用於比較ab兩個物件是否深度相等,為什麼要叫深度相等?因為ab兩個物件都可以為陣列。由於JavaObject類是一切類的基類,所以Object o = new Object[10]的程式碼是被允許的。所以傳入的物件可以是一個數組如果傳入的物件是陣列,要比較兩個物件是否深度相等,就要比較兩個陣列對應下標的元素是否都相等。如果傳入的物件有一個不是陣列,就直接呼叫a物件的equals方法傳入b物件比較兩物件是否相等。下面我們來看下原始碼:

public static boolean deepEquals(Object a, Object b) {
//如果ab指向同一地址,則ab是同一物件,返回true
if (a == b)
return true;
//如果ab中有一物件為空,則ab不是同一型別物件,返回false。這樣也避免了當a為空或者b為空時呼叫equals方法造成的空指標引用異常。
else if (a == null || b == null)
return false;
//否則,呼叫Arrays類的deepEquals0方法對ab進行深度比較。
else
return Arrays.deepEquals0(a, b);
}

我們跳到Arrays類的deepEquals0方法進行分析,雖然有很多的判斷語句,但是邏輯基本相同,我們就分析其中幾個:

static boolean deepEquals0(Object e1, Object e2) {
//因為之後要呼叫e1equals方法,所以e1不能為空。
assert e1 != null;
//定義返回值。
boolean eq;
//這個if是用於判斷引用資料型別陣列的,如果e1e2都是引用資料型別陣列的話,就呼叫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);
//如果e1e2不全為陣列,就呼叫e1equals方法。
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的結果,否則返回第二個引數