深入瞭解Java核心類庫–Objects類
1 Objects
1.1 Objects方法
工具類,常用於檢查操作
返回值 | 方法名 | 作用 |
---|---|---|
static int | checkFromIndexSize(int fromIndex, int size, int length) | 檢查子范圍[ fromIndex ,fromIndex + size)是否在 [0,length)范圍界限內。 |
static int | checkFromToIndex(int fromIndex, int toIndex, int length) | 檢查子范圍[ fromIndex ,toIndex)是否在 [0,length)范圍界限內 |
static int | checkIndex(int index, int length) | 檢查子范圍index是否在 [0,length)范圍界限內 |
static int | compare(T a, T b, Comparator<? super T> c) | 如果參數a,b相同則返回0,否則返回c.compare(a, b)的結果 |
static boolean | deepEquals(Object a, Object b) | 對比a,b參數是否深層次相等(如果a,b為數組,則對比數組的每個參數) |
static boolean | equals(Object a, Object b) | 對比a,b參數是否相等 |
static int | hash(Object… values) | 為輸入值序列生成哈希碼 |
static int | hashCode(Object o) | 非空返回哈希碼,null則拋出NullPointerException |
static boolean | isNull(Object obj) | obj參數為null返回true |
static boolean | nonNull(Object obj) | obj參數不為null返回true |
static T | requireNonNull(T obj) | 檢查指定的對象引用不是 null,為null則拋出NullPointerException |
static T | requireNonNull(T obj, String message) | 檢查指定的對象引用不是null,否則拋出自定義的NullPointerException |
static T | requireNonNull(T obj, Supplier messageSupplier) | 檢查指定的對象引用是否為null ,如果是,則拋出自定義的NullPointerException 。 |
static T | requireNonNullElse(T obj, T defaultObj) | 如果它是非 null ,則返回第一個參數,否則返回非 null第二個參數。 |
static T | requireNonNullElseGet(T obj, Supplier<? extends T> supplier) | 如果它是非 null ,則返回第一個參數,否則返回非 null值 supplier.get() 。 |
static String | toString(Object o) | 返回對象的字符串表示形式 |
static String | toString(Object o, String nullDefault) | 如果第一個參數不是 null ,則返回第一個參數調用 toString的結果,否則返回第二個參數 |
1.2 Objects常用方法
1.2.1 equals(Object a, Object b)
equals(Object a, Object b)源碼:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
1.2.2 isNull(Object obj)
isNull(Object obj)源碼:
public static boolean isNull(Object obj) {
return obj == null;
}
1.2.3 nonNull(Object obj)
nonNull(Object obj)源碼:
public static boolean nonNull(Object obj) {
return obj != null;
}
1.2.4 requireNonNull(T obj)
requireNonNull(T obj)源碼:
public static T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
1.3 Objects源碼
package java.util; import jdk.internal.util.Preconditions; import jdk.internal.vm.annotation.ForceInline; import java.util.function.Supplier; public final class Objects { private Objects() { throw new AssertionError("No java.util.Objects instances for you!"); } public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } public static boolean deepEquals(Object a, Object b) { if (a == b) return true; else if (a == null || b == null) return false; else return Arrays.deepEquals0(a, b); } public static int hashCode(Object o) { return o != null ? o.hashCode() : 0; } public static int hash(Object... values) { return Arrays.hashCode(values); } public static String toString(Object o) { return String.valueOf(o); } public static String toString(Object o, String nullDefault) { return (o != null) ? o.toString() : nullDefault; } public static <T> int compare(T a, T b, Comparator<? super T> c) { return (a == b) ? 0 : c.compare(a, b); } public static <T> T requireNonNull(T obj) { if (obj == null) throw new NullPointerException(); return obj; } public static <T> T requireNonNull(T obj, String message) { if (obj == null) throw new NullPointerException(message); return obj; } public static boolean isNull(Object obj) { return obj == null; } public static boolean nonNull(Object obj) { return obj != null; } public static <T> T requireNonNullElse(T obj, T defaultObj) { return (obj != null) ? obj : requireNonNull(defaultObj, "defaultObj"); } public static <T> T requireNonNullElseGet(T obj, Supplier<? extends T> supplier) { return (obj != null) ? obj : requireNonNull(requireNonNull(supplier, "supplier").get(), "supplier.get()"); } public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) { if (obj == null) throw new NullPointerException(messageSupplier == null ? null : messageSupplier.get()); return obj; } @ForceInline public static int checkIndex(int index, int length) { return Preconditions.checkIndex(index, length, null); } public static int checkFromToIndex(int fromIndex, int toIndex, int length) { return Preconditions.checkFromToIndex(fromIndex, toIndex, length, null); } public static int checkFromIndexSize(int fromIndex, int size, int length) { return Preconditions.checkFromIndexSize(fromIndex, size, length, null); } }
2 區別於Object
2.1 Object構造方法
public Object()
- Object類是基類,是所有類的父類(基類)
- 如果一個類沒有明確的繼承某一個具體的類,則將默認繼承Object類
例如我們定義一個類:
public class Person{
}
其實它被使用時 是這樣的:
public class Person extends Object{
}
- object的多態:使用Object可以接收任意的引用數據類型
例:
public static void main(String[] args){ String text = "123"; say(text); int a = 10; say(a); say("123"); } public static void say(Object o){//多態的體現 System.out.println(o); }
2.2 Object其他方法
返回值 | 方法名 | 作用 |
---|---|---|
static int | checkFromIndexSize(int fromIndex, int size, int length) | 檢查子范圍[ fromIndex ,fromIndex + size)是否在 [0,length)范圍界限內。 |
static int | checkFromToIndex(int fromIndex, int toIndex, int length) | 檢查子范圍[ fromIndex ,toIndex)是否在 [0,length)范圍界限內 |
static int | checkIndex(int index, int length) | 檢查子范圍index是否在 [0,length)范圍界限內 |
static int | compare(T a, T b, Comparator<? super T> c) | 如果參數a,b相同則返回0,否則返回c.compare(a, b)的結果 |
static boolean | deepEquals(Object a, Object b) | 對比a,b參數是否深層次相等(如果a,b為數組,則對比數組的每個參數) |
static boolean | equals(Object a, Object b) | 對比a,b參數是否相等 |
static int | hash(Object… values) | 為輸入值序列生成哈希碼 |
static int | hashCode(Object o) | 非空返回哈希碼,null則拋出NullPointerException |
static boolean | isNull(Object obj) | obj參數為null返回true |
static boolean | nonNull(Object obj) | obj參數不為null返回true |
static T | requireNonNull(T obj) | 檢查指定的對象引用不是 null,為null則拋出NullPointerException |
static T | requireNonNull(T obj, String message) | 檢查指定的對象引用不是null,否則拋出自定義的NullPointerException |
static T | requireNonNull(T obj, Supplier messageSupplier) | 檢查指定的對象引用是否為null ,如果是,則拋出自定義的NullPointerException 。 |
static T | requireNonNullElse(T obj, T defaultObj) | 如果它是非 null ,則返回第一個參數,否則返回非 null第二個參數。 |
static T | requireNonNullElseGet(T obj, Supplier<? extends T> supplier) | 如果它是非 null ,則返回第一個參數,否則返回非 null值 supplier.get() 。 |
static String | toString(Object o) | 返回對象的字符串表示形式 |
static String | toString(Object o, String nullDefault) | 如果第一個參數不是 null ,則返回第一個參數調用 toString的結果,否則返回第二個參數 |
2.2.1 equals(Object obj)
equals(Object obj)源碼:
public boolean equals(Object obj) {
return (this == obj);
}
- equals方法在非null對象引用上實現等價關系
- 等於
- 對於任何非空引用值x和y,當且僅當x和y引用同一對象( x == y具有值true )時,此方法返回true
- ==比的是內存地址
- 請註意,通常需要在重寫此方法時覆蓋hashCode方法,以便維護hashCode方法的常規協定,該方法聲明相等對象必須具有相等的哈希代碼。
public static void main(String[] args) { Person p = new Person(1234,"張三"); Person e = new Person(2345,"李四"); System.out.println("p:"+p.hashCode());//p:1239731077 System.out.println("e:"+e.hashCode());//e:357863579 System.out.println(p.equals(e));//false e=p;//此時指向相同的內存地址 System.out.println("e:"+e.hashCode());//e:1239731077 System.out.println(p.equals(e));//true }
輸出結果:
p:1239731077
e:357863579
false
e:1239731077
true
equals方法重寫時的五個特性:
自反性 :對於任何非空的參考值x , x.equals(x)應該返回true 。
對稱性 :對於任何非空引用值x和y , x.equals(y)應該返回true當且僅當y.equals(x)返回true 。
傳遞性 :對於任何非空引用值x ,y和z ,如果x.equals(y)回報true並且y.equals(z)返回true,x.equals(z)應該返回true 。
一致性 :對於任何非空引用值x和y ,多次調用x.equals(y)始終返回true或始終返回false ,前提是未修改對象上的equals比較中使用的信息。
非空性 :對於任何非空的參考值x , x.equals(null)應該返回false 。
2.2.2 toString()
toString()源碼
public String toString() {
return getClass().getName() + “@” + Integer.toHexString(hashCode());
}
默認為字符串,通常返回一個“文本表示”此對象的字符串,返回對象的內存地址(對象實例的類名稱@對象的哈希碼的無符號十六進制,即:getClass().getName() + ‘@’ + Integer.toHexString(hashCode()))
public static void main(String[] args) { Person p = new Person(1234,"張三"); Person e = new Person(2345,"李四"); System.out.println("e.getClass():"+e.getClass()); System.out.println("e.hashCode():"+e.hashCode()); System.out.println("e.toString():"+e.toString()); }
輸出結果:
e.getClass():class com.company.demo.Person
e.hashCode():114132791
e.toString():com.company.demo.Person@6cd8737
- 建議重寫Object中的toString方法
2.3 Object源碼
package java.lang; import jdk.internal.HotSpotIntrinsicCandidate; public class Object { private static native void registerNatives(); static { registerNatives(); } @HotSpotIntrinsicCandidate public Object() {} @HotSpotIntrinsicCandidate public final native Class<?> getClass(); @HotSpotIntrinsicCandidate public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } @HotSpotIntrinsicCandidate protected native Object clone() throws CloneNotSupportedException; public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); } @HotSpotIntrinsicCandidate public final native void notify(); @HotSpotIntrinsicCandidate public final native void notifyAll(); public final void wait() throws InterruptedException { wait(0L); } public final native void wait(long timeoutMillis) throws InterruptedException; public final void wait(long timeoutMillis, int nanos) throws InterruptedException { if (timeoutMillis < 0) { throw new IllegalArgumentException("timeoutMillis value is negative"); } if (nanos < 0 || nanos > 999999) { throw new IllegalArgumentException( "nanosecond timeout value out of range"); } if (nanos > 0) { timeoutMillis++; } wait(timeoutMillis); } protected void finalize() throws Throwable { } }
總結
本篇文章就到這裡瞭,希望能給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!
推薦閱讀:
- 一文帶你瞭解Java中的Object類及類中方法
- 搞懂JAVAObject中的hashCode()
- 淺談java中為什麼重寫equals後需要重寫hashCode
- Java中如何正確重寫equals方法
- Java基礎之淺談hashCode()和equals()