国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java 基礎(chǔ) | Object 源碼解析

dendoink / 2977人閱讀

摘要:注釋指出方法返回散列值。直到其他線程調(diào)用此對(duì)象的方法或方法,當(dāng)前線程被喚醒進(jìn)入就緒狀態(tài)。總超時(shí)時(shí)間以納秒為單位計(jì)算為。以上注釋主要就是描述了,和方法的使用規(guī)范。主要的區(qū)別在于在釋放同時(shí),釋放了對(duì)象鎖的控制。

Java 是一門面向?qū)ο蟮恼Z(yǔ)言,在 Java 里面一切都可以看作是一個(gè)對(duì)象,而 Java 里面所有的對(duì)象都默認(rèn)繼承于 Object 類,所以狗哥今天就復(fù)習(xí)了一遍這個(gè)類。

上圖看出 Object 一共有 12 個(gè)方法,其中 registerNatives() 是由 C 語(yǔ)言實(shí)現(xiàn)的,這個(gè)不在研究范圍內(nèi)。

1、getClass
/**
     * Returns the runtime class of this {@code Object}. The returned
     * {@code Class} object is the object that is locked by {@code
     * static synchronized} methods of the represented class.
*/
public final native Class getClass();

這個(gè)方法的作用就是返回某個(gè)對(duì)象的運(yùn)行時(shí)類,它的返回值是 Class 類型,Class c = obj.getClass();通過(guò)對(duì)象 c ,我們可以獲取該對(duì)象的所有成員方法,每個(gè)成員方法都是一個(gè) Method 對(duì)象;我們也可以獲取該對(duì)象的所有成員變量,每個(gè)成員變量都是一個(gè) Field 對(duì)象;同樣的,我們也可以獲取該對(duì)象的構(gòu)造函數(shù),構(gòu)造函數(shù)則是一個(gè) Constructor 對(duì)象。這個(gè)方法在反射時(shí)會(huì)常用到。

2、hashCode
/**
     * Returns a hash code value for the object. This method is
     * supported for the benefit of hash tables such as those provided by
     * {@link java.util.HashMap}.
*/
    public native int hashCode();

這個(gè)方法的注釋比較長(zhǎng),就不放出來(lái)了。注釋指出:

hashCode 方法返回散列值。

返回值默認(rèn)是由對(duì)象的地址轉(zhuǎn)換而來(lái)的。

同一個(gè)對(duì)象調(diào)用 hashCode 的返回值是相等的。

兩個(gè)對(duì)象的 equals 相等,那 hashCode 一定相等。

兩個(gè)對(duì)象的 equals 不相等,那 hashCode 也不一定相等。

3、equals
public boolean equals(Object obj) {
    return (this == obj);
}

equals 的實(shí)現(xiàn)非常簡(jiǎn)單,它的作用就是比較兩個(gè)對(duì)象是否相等,而比較的依據(jù)就是二者的內(nèi)存地址。除此之外,equals 還遵循以下幾個(gè)原則:

1、自反性:x.equals(x);  // true
2、對(duì)稱性:x.equals(y) == y.equals(x);  // true
3、傳遞性:if (x.equals(y) && y.equals(z))
            x.equals(z); // true;

4、一致性,只要對(duì)象沒(méi)有被修改,多次調(diào)用 equals() 方法結(jié)果不變:
x.equals(y) == x.equals(y); // true 

5、非空性,對(duì)任何不是 null 的對(duì)象 x 調(diào)用 x.equals(null) 結(jié)果都為 false :
x.equals(null); // false;

為什么要重寫(xiě) hashcode 和 equals ?

這個(gè)問(wèn)題之前分享過(guò)舊文:https://mp.weixin.qq.com/s/iI...

4、clone
protected native Object clone() throws CloneNotSupportedException;

clone() 是 Object 的 protected 方法,它不是 public,一個(gè)類不顯式去重寫(xiě) clone(),其它類就不能直接去調(diào)用該類實(shí)例的 clone() 方法。此外,Clone 的注釋中還提到比較重要的幾點(diǎn):

克隆的對(duì)象必須要實(shí)現(xiàn) Cloneable 接口并重寫(xiě) clone 方法,否則會(huì)報(bào) CloneNotSupportedException 異常

clone() 方法并不是 Cloneable 接口的方法,而是 Object 的一個(gè) protected 方法。Cloneable 接口只是規(guī)定,如果一個(gè)類沒(méi)有實(shí)現(xiàn) Cloneable 接口又調(diào)用了 clone() 方法,就會(huì)拋出 CloneNotSupportedException。

淺拷貝:拷貝對(duì)象和原始對(duì)象的引用類型引用同一個(gè)對(duì)象。

深拷貝:拷貝對(duì)象和原始對(duì)象的引用類型引用不同對(duì)象。

關(guān)于淺拷貝與深拷貝的詳解,請(qǐng)看這篇舊文:
https://mp.weixin.qq.com/s/I6...

5、toString
public String toString() {
       return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

這個(gè)方法應(yīng)該沒(méi)什么好講的,原生的 toString 方法僅僅返回,對(duì)象名 + 它的 hashCode ,但做過(guò)開(kāi)發(fā)的都知道,原生的 toString 作用不大。我們需要重寫(xiě) toString 一般是因?yàn)榉奖阏{(diào)試,需要知道對(duì)象的屬性值,而不僅僅是 hashCode 。所以,應(yīng)該像下面這樣重寫(xiě):

public class Student {

    private int age;

    private String name;

    // 省略 get、set

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name="" + name + """ +
                "}";
    }
}
6、notify 和 wait
public final native void notify();
public final native void notifyAll();

首先是 notify ,注釋就不貼出來(lái)了,notify 的作用就是隨機(jī)喚醒在等待隊(duì)列的某個(gè)線程,而 notifyAll 就是喚醒在等待隊(duì)列的所有線程。

public final void wait() throws InterruptedException {
     wait(0);
}

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
}

然后是 wait ,wait 的作用是讓當(dāng)前線程進(jìn)入等待狀態(tài),同時(shí),wait() 也會(huì)讓當(dāng)前線程釋放它所持有的鎖。直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法,當(dāng)前線程被喚醒進(jìn)入就緒狀態(tài)。

wait(long timeout) (以毫秒為單位)讓當(dāng)前線程處于等待(阻塞)狀態(tài),直到其他線程調(diào)用此對(duì)象的notify() 方法或 notifyAll() 方法,或者超過(guò)指定的時(shí)間量,當(dāng)前線程被喚醒進(jìn)入就緒狀態(tài)。

wait(long timeout, int nanos) 和 wait(long timeout) 功能一樣,唯一的區(qū)別是這個(gè)可以提供更高的精度。總超時(shí)時(shí)間(以納秒為單位)計(jì)算為 1000000 *timeout+ nanos。By the way ,wait(0,0) 和 wait(0) 效果一樣。

除此之外,notify 和 wait 的注釋中還有這么一段:

* 

* This method should only be called by a thread that is the owner * of this object"s monitor. A thread becomes the owner of the * object"s monitor in one of three ways: *

    *
  • By executing a synchronized instance method of that object. *
  • By executing the body of a {@code synchronized} statement * that synchronizes on the object. *
  • For objects of type {@code Class,} by executing a * synchronized static method of that class. *
*

看到這英文,剛過(guò)四級(jí)的我瑟瑟發(fā)抖。以上注釋主要就是描述了,notify 和 wait 方法的使用規(guī)范。意思就是這二者必須在 synchronized 修飾的同步方法或同步代碼中使用。

為什么 wait() 必須在同步 (Synchronized) 方法/代碼塊中調(diào)用?

答:調(diào)用 wait() 就是釋放鎖,釋放鎖的前提是必須要先獲得鎖,先獲得鎖才能釋放鎖。

為什么 notify()、notifyAll() 必須在同步 (Synchronized) 方法/代碼塊中調(diào)用?

答:notify()、notifyAll() 是將鎖交給含有 wait() 方法的線程,讓其繼續(xù)執(zhí)行下去,如果自身沒(méi)有鎖,怎么叫把鎖交給其他線程呢?(本質(zhì)是讓處于入口隊(duì)列的線程競(jìng)爭(zhēng)鎖)

詳細(xì)解釋請(qǐng)參考這篇博文:https://blog.csdn.net/qq_42145871/article/details/81950949

Thread.sleep() 和 Object.wait() 有什么區(qū)別?

首先,二者都可以暫停當(dāng)前線程,釋放 CPU 控制權(quán)。主要的區(qū)別在于 Object.wait()在釋放 CPU 同時(shí),釋放了對(duì)象鎖的控制。而 Thread.sleep() 沒(méi)有對(duì)鎖釋放。換句話說(shuō) sleep 就是耍流氓,占著茅坑不拉屎。

推薦閱讀:

1、java | 什么是動(dòng)態(tài)代理

2、SpringBoot?| 啟動(dòng)原理

3、SpringBoot | 自動(dòng)配置原理

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/76021.html

相關(guān)文章

  • gson-plugin基礎(chǔ)源碼分析(二)

    摘要:對(duì)于如果以修改源碼的方式,也可以通過(guò)判斷當(dāng)前的數(shù)據(jù)類型是否與預(yù)期的數(shù)據(jù)類型一致的方式進(jìn)行。但由于每種數(shù)據(jù)類型都是一個(gè)匿名內(nèi)部類,很難通過(guò)判斷預(yù)期的數(shù)據(jù)類型是啥,所以可以通過(guò)添加捕獲異常,在發(fā)生異常后,跳過(guò)解析。 一、項(xiàng)目地址 項(xiàng)目地址:github-gson-plugin 二、Gson解析核心類 1.ArrayTypeAdapter.JAVA 用于解析數(shù)組類型的數(shù)據(jù) public ...

    beanlam 評(píng)論0 收藏0
  • Java集合之ArrayList源碼解析

    摘要:數(shù)組的大小會(huì)根據(jù)容量的增長(zhǎng)而動(dòng)態(tài)的增長(zhǎng),具體的增長(zhǎng)方式請(qǐng)看這里構(gòu)造函數(shù)提供了三種方式的構(gòu)造器。這些元素按照該的迭代器返回的順序排列的。 原文地址 ArrayList ArrayList是List接口的 可變數(shù)組的實(shí)現(xiàn)。實(shí)現(xiàn)了所有可選列表操作,并允許包括 null 在內(nèi)的所有元素。除了實(shí)現(xiàn) List接口外,此類還提供一些方法來(lái)操作內(nèi)部用來(lái)存儲(chǔ)列表的數(shù)組的大小。ArrayList繼承自 A...

    W4n9Hu1 評(píng)論0 收藏0
  • dubbo源碼解析(四十二)序列化——開(kāi)篇

    摘要:在版本中,支持五種序列化方式,分別是依賴阿里的庫(kù),功能強(qiáng)大支持普通類包括任意或完全兼容序列化協(xié)議的系列化框架,序列化速度大概是的倍,大小是大小的左右。但這里實(shí)際不是原生的序列化,而是阿里修改過(guò)的,它是默認(rèn)啟用的序列化方式自帶的序列化實(shí)現(xiàn)。 序列化——開(kāi)篇 目標(biāo):介紹dubbo中序列化的內(nèi)容,對(duì)dubbo中支持的序列化方式做對(duì)比,介紹dubbo-serialization-api下的源碼...

    keke 評(píng)論0 收藏0
  • 慕課網(wǎng)_《JSON快速入門(Java版)》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期日說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。慕課網(wǎng)教學(xué)示例源碼無(wú)個(gè)人學(xué)習(xí)源碼第一章課程概述課程介紹課程須知本課程面向所有使用語(yǔ)言進(jìn)行開(kāi)發(fā)的小伙伴。 時(shí)間:2017年05月21日星期日說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:無(wú)個(gè)人學(xué)習(xí)源碼:https://github.com/zccodere/s... 第一章:課程概述 1-1 ...

    shiina 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

dendoink

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<