溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中如何使用Objects類

發(fā)布時間:2021-07-29 17:43:28 來源:億速云 閱讀:223 作者:Leah 欄目:開發(fā)技術

Java中如何使用Objects類,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

    1 Objects

    1.1 Objects方法

    工具類,常用于檢查操作

    返回值方法名作用
    static intcheckFromIndexSize(int fromIndex, int size, int length)檢查子范圍[ fromIndex ,fromIndex + size)是否在 [0,length)范圍界限內。
    static intcheckFromToIndex(int fromIndex, int toIndex, int length)檢查子范圍[ fromIndex ,toIndex)是否在 [0,length)范圍界限內
    static intcheckIndex(int index, int length)檢查子范圍index是否在 [0,length)范圍界限內
    static intcompare(T a, T b, Comparator<? super T> c)如果參數a,b相同則返回0,否則返回c.compare(a, b)的結果
    static booleandeepEquals(Object a, Object b)對比a,b參數是否深層次相等(如果a,b為數組,則對比數組的每個參數)
    static booleanequals(Object a, Object b)對比a,b參數是否相等
    static inthash(Object… values)為輸入值序列生成哈希碼
    static inthashCode(Object o)非空返回哈希碼,null則拋出NullPointerException
    static booleanisNull(Object obj)obj參數為null返回true
    static booleannonNull(Object obj)obj參數不為null返回true
    static TrequireNonNull(T obj)檢查指定的對象引用不是 null,為null則拋出NullPointerException
    static TrequireNonNull(T obj, String message)檢查指定的對象引用不是null,否則拋出自定義的NullPointerException
    static TrequireNonNull(T obj, Supplier messageSupplier)檢查指定的對象引用是否為null ,如果是,則拋出自定義的NullPointerException 。
    static TrequireNonNullElse(T obj, T defaultObj)如果它是非 null ,則返回第一個參數,否則返回非 null第二個參數。
    static TrequireNonNullElseGet(T obj, Supplier<? extends T> supplier)如果它是非 null ,則返回第一個參數,否則返回非 null值 supplier.get() 。
    static StringtoString(Object o)返回對象的字符串表示形式
    static StringtoString(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 區(qū)別于Object

    2.1 Object構造方法

    public Object()

    • Object類是基類,是所有類的父類(基類)

    • 如果一個類沒有明確的繼承某一個具體的類,則將默認繼承Object類

    例如我們定義一個類:

    public class Person{
    }
    其實它被使用時 是這樣的:
    public class Person extends Object{
    }

    • object的多態(tài):使用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){//多態(tài)的體現
    	System.out.println(o);
    }

    2.2 Object其他方法

    返回值方法名作用
    static intcheckFromIndexSize(int fromIndex, int size, int length)檢查子范圍[ fromIndex ,fromIndex + size)是否在 [0,length)范圍界限內。
    static intcheckFromToIndex(int fromIndex, int toIndex, int length)檢查子范圍[ fromIndex ,toIndex)是否在 [0,length)范圍界限內
    static intcheckIndex(int index, int length)檢查子范圍index是否在 [0,length)范圍界限內
    static intcompare(T a, T b, Comparator<? super T> c)如果參數a,b相同則返回0,否則返回c.compare(a, b)的結果
    static booleandeepEquals(Object a, Object b)對比a,b參數是否深層次相等(如果a,b為數組,則對比數組的每個參數)
    static booleanequals(Object a, Object b)對比a,b參數是否相等
    static inthash(Object… values)為輸入值序列生成哈希碼
    static inthashCode(Object o)非空返回哈希碼,null則拋出NullPointerException
    static booleanisNull(Object obj)obj參數為null返回true
    static booleannonNull(Object obj)obj參數不為null返回true
    static TrequireNonNull(T obj)檢查指定的對象引用不是 null,為null則拋出NullPointerException
    static TrequireNonNull(T obj, String message)檢查指定的對象引用不是null,否則拋出自定義的NullPointerException
    static TrequireNonNull(T obj, Supplier messageSupplier)檢查指定的對象引用是否為null ,如果是,則拋出自定義的NullPointerException 。
    static TrequireNonNullElse(T obj, T defaultObj)如果它是非 null ,則返回第一個參數,否則返回非 null第二個參數。
    static TrequireNonNullElseGet(T obj, Supplier<? extends T> supplier)如果它是非 null ,則返回第一個參數,否則返回非 null值 supplier.get() 。
    static StringtoString(Object o)返回對象的字符串表示形式
    static StringtoString(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方法的常規(guī)協定,該方法聲明相等對象必須具有相等的哈希代碼。

    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 { }
    }

    看完上述內容,你們掌握Java中如何使用Objects類的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI