Object的常用方法

所有的類都默認繼承Object這個基類绞铃,基本數(shù)據(jù)類型不是類,所以不繼承喝检,但它們的封裝類繼承嗅辣,使用基本數(shù)據(jù)類型時會自動封箱為封裝類。equals()挠说、getClass()澡谭、hashCode()、toString()是Object常用的方法损俭。

equals(Object obj)方法

API蛙奖,源碼:

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

==用于判斷兩個引用是否指向同一個對象。所以equals方法用于判斷兩個對象是否在意義上相等杆兵,即這兩個對象是否是同一個對象雁仲。

Dog d = new Dog();
Cat c = new Cat();
Cat c2 = new Cat();
Dog d2 = d;

System.out.println(d.equals(c));
System.out.println(c.equals(c2));
System.out.println(d.equals(d2));
false //因為兩個實例對象不同
false //因為引用對象c和c2指向不同實例
true //因為引用對象d和d2指向同一實例

String重寫了equals方法,比較兩個String對象是否帶有相同的字節(jié)組合:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])//比較每一個字符是否相同
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

輸出結(jié)果為“true”:

String s = "hello";
String s2 = "hello";

String s3 = new String("world");
String s4 = new String("world");

if (s.equals(s2) && s3.equals(s4)) {
    System.out.println("true");
} else {
    System.out.println("false");
}

在重寫equals()方法的同時,需要重寫hashCode()方法礼饱,equals()與hashCode()關(guān)系:如果兩個對象equal继蜡,hashCode值相同。

==用來比較兩個primitive主數(shù)據(jù)類型是否相等吹艇,或者判斷兩個引用是否引用同一個對象。

int a = 1;
int a1 = 2;
a == a1;  //false

Dog d = new Dog();
Dog d2 = new Dog();
Cat c = new Cat();
d == c;    //false
d == d2;   //false

getClass()方法

API昂拂,源碼:

public final native Class<?> getClass();//類型

getClass()返回的對象受神,代表當前對象運行時的類。此對象包含當前對象的類相關(guān)信息格侯,如類名鼻听、包名财著、繼承那些接口、有那些屬性撑碴、有那些方法等撑教。

native方法像一個接口,有實現(xiàn)灰羽,但實現(xiàn)是其他編程語言(如:C)編寫的驮履。abstract關(guān)鍵字代表沒有實現(xiàn),所以不能和native連用廉嚼。

ArrayList<Integer> li = new ArrayList<>();
ArrayList<Float> lf = new ArrayList<>();
System.out.println(li.getClass());
System.out.println(lf.getClass());
if (li.getClass() == lf.getClass()) {
    System.out.println("Equals");
} else {
    System.out.println("Not Equals");
}
System.out.println(lf.getClass().getName());
System.out.println(lf.getClass().toString());
System.out.println(lf.getClass().getPackage());
System.out.println(Arrays.toString(lf.getClass().getInterfaces()));
class java.util.ArrayList
class java.util.ArrayList
Equals
java.util.ArrayList
class java.util.ArrayList
package java.util, Java Platform API Specification, version 1.8
[interface java.util.List, interface java.util.RandomAccess, interface java.lang.Cloneable, interface java.io.Serializable]

getClass()告訴我們對象從哪里被初始化玫镐,li.getClass()lf.getClass()均為class java.util.ArrayList,兩個對象均在ArrayList中初始化怠噪。

我們經(jīng)常在反射中使用getClass()方法恐似。

private void reflectData(Object o){
    Class objectCla = o.getClass();
    //獲取當前對象已聲明的所有屬性(字段Field)
    Field[] fs = objectCla.getDeclaredFields();
    //獲取當前對象所有的方法
    Method[] methods = objectCla.getMethods();
}

hashCode()方法

API,源碼:

public native int hashCode();

此方法返回一個對象的哈希代碼(int類型)傍念,相當于對象的一個唯一ID矫夷。

hashCode()方法和equals()方法的關(guān)系:如果兩個對象"equal",則hashCode相等憋槐;如果兩個對象hashCode值相等双藕,但不一定是同一個對象。String重寫了hashCode方法:

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];//val[i]阳仔,當前字符對應的ASCII值忧陪。h->104
        }
        hash = h;//緩存hash,提高性能
    }
    return h;
}

s近范、s2嘶摊、s3都有相同的字符組合,所以三者的hashCode相等评矩,都為99162322叶堆。

String s = "hello";
String s2 = new String("hello");
String s3 = new String("hello");

System.out.println(s.hashCode());//99162322
System.out.println(s2.hashCode());//99162322
System.out.println(s3.hashCode());//99162322

hashCode()主要在Hash集合中起作用,如HashSet斥杜、HashMap等虱颗。HashMap中的作用:往HashMap中put鍵值對元素時,當根據(jù)key的hashCode生成的數(shù)組下標的位置沒有元素時蔗喂,將鍵值對放在此位置上枕。如果有元素,依次判斷此位置鏈表的key的hash值(根據(jù)hashCode生成)是否相同以及(&&)key是否相等弱恒,滿足則替換value,不滿足棋恼,則鏈接到鏈表后面返弹。詳情:HashMap的put方法源碼(jdk1.8)

if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))

toString()方法

API锈玉,源碼:

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

我們從源碼可以看出此方法返回對象運行時類的名稱和一個16進制的哈希碼。常用于將Object對象轉(zhuǎn)換為String义起。

HashMap<String, Object> map = new HashMap<>();
map.put("Integer", 1);//int自動裝箱為Integer
map.put("Float", 1.5f);//float自動裝箱為Float
Integer i = Integer.valueOf(map.get("Integer").toString());
Float f = Float.valueOf(map.get("Float").toString());

我們常使用的toString方法重寫了此方法拉背。如AbstractMap的toString,HashMap繼承此方法默终。

public String toString() {
    Iterator<Entry<K,V>> i = entrySet().iterator();
    if (! i.hasNext())
        return "{}";

    StringBuilder sb = new StringBuilder();
    sb.append('{');
    for (;;) {
        Entry<K,V> e = i.next();
        K key = e.getKey();
        V value = e.getValue();
        sb.append(key   == this ? "(this Map)" : key);
        sb.append('=');
        sb.append(value == this ? "(this Map)" : value);
        if (! i.hasNext())
            return sb.append('}').toString();
        sb.append(',').append(' ');
    }
}

StringBuffer的toString:

@Override
public synchronized String toString() {
    if (toStringCache == null) {
        toStringCache = Arrays.copyOfRange(value, 0, count);
    }
    return new String(toStringCache, true);
}

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椅棺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子齐蔽,更是在濱河造成了極大的恐慌两疚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件含滴,死亡現(xiàn)場離奇詭異诱渤,居然都是意外死亡,警方通過查閱死者的電腦和手機谈况,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門勺美,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碑韵,你說我怎么就攤上這事赡茸。” “怎么了祝闻?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵占卧,是天一觀的道長。 經(jīng)常有香客問我治筒,道長屉栓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任耸袜,我火速辦了婚禮友多,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堤框。我一直安慰自己域滥,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布蜈抓。 她就那樣靜靜地躺著启绰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沟使。 梳的紋絲不亂的頭發(fā)上委可,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音,去河邊找鬼着倾。 笑死拾酝,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的卡者。 我是一名探鬼主播蒿囤,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼崇决!你這毒婦竟也來了材诽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤恒傻,失蹤者是張志新(化名)和其女友劉穎脸侥,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碌冶,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡湿痢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扑庞。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片譬重。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罐氨,靈堂內(nèi)的尸體忽然破棺而出臀规,到底是詐尸還是另有隱情,我是刑警寧澤栅隐,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布塔嬉,位于F島的核電站,受9級特大地震影響租悄,放射性物質(zhì)發(fā)生泄漏谨究。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一泣棋、第九天 我趴在偏房一處隱蔽的房頂上張望胶哲。 院中可真熱鬧,春花似錦潭辈、人聲如沸鸯屿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寄摆。三九已至,卻和暖如春修赞,著一層夾襖步出監(jiān)牢的瞬間婶恼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勾邦,地道東北人联逻。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像检痰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锨推,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法铅歼,類相關(guān)的語法,內(nèi)部類的語法换可,繼承相關(guān)的語法椎椰,異常的語法,線程的語...
    子非魚_t_閱讀 31,665評論 18 399
  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,268評論 0 16
  • 從三月份找實習到現(xiàn)在译荞,面了一些公司瓤的,掛了不少,但最終還是拿到小米吞歼、百度圈膏、阿里、京東篙骡、新浪稽坤、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,278評論 11 349
  • 關(guān)于 “ == ” “ == ”操作符主要比較的是操作符兩端對象的內(nèi)存地址。如果兩個對象的內(nèi)存地址是一致的得湘,那么就...
    EakonZhao閱讀 1,364評論 3 15
  • 聽著海浪的聲音 海鷗在跳躍著 蹲下身子捧一把沙 臉上布滿著水珠 咸咸的 不知 是海水杖玲,還是淚水
    Sty兮城閱讀 286評論 0 0