深入瞭解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的更多內容!

推薦閱讀: