java中Object類的常用方法總結(jié)

一、clone

  • 淺克虑ζァ:創(chuàng)建一個(gè)新對(duì)象押赊,新對(duì)象的屬性和原來對(duì)象完全相同,對(duì)于非基本類型屬性,仍指向原有屬性所指向的對(duì)象的內(nèi)存地址流礁。
  • 深克绿樗住:創(chuàng)建一個(gè)新對(duì)象,屬性中引用的其他對(duì)象也會(huì)被克隆神帅,不再指向原有對(duì)象地址再姑。
    總之深淺克隆都會(huì)在堆中新分配一塊區(qū)域,區(qū)別在于對(duì)象屬性引用的對(duì)象是否需要進(jìn)行克抡矣(遞歸性的)元镀。

case:

public class Main {

    public static void main(String[] args) {
        // 創(chuàng)建父親(LiSi),兒子(LiWu)霎桅,孫子(LiLiu)并關(guān)聯(lián)
        Son father = new Son();
        father.setName("LiSi");
        Son son = new Son();
        son.setName("LiWu");
        Son grandSon = new Son();
        grandSon.setName("LiLiu");
        father.setSon(son);
        son.setSon(grandSon);
        // 調(diào)用clone方法
        Son fatherCopy = null;
        try {
            fatherCopy = (Son) father.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        boolean flag1 = fatherCopy==father;
        boolean flag2 = fatherCopy.getSon() == son;
        boolean flag3 = fatherCopy.getSon().getSon() == grandSon;
        // 比較克隆后的地址

        System.out.println(flag1);// false
        System.out.println(flag2);// true
        System.out.println(flag3);// true
        // 比較Name
        flag1= fatherCopy.getName()==father.getName();
        flag2 = fatherCopy.getSon().getName() == son.getName();
        flag3 = fatherCopy.getSon().getSon().getName() == grandSon.getName();
        System.out.println(flag1);// true
        System.out.println(flag2);// true
        System.out.println(flag3);// true
    }
}

如上栖疑,如果對(duì)象實(shí)現(xiàn)Cloneable并重寫clone方法不進(jìn)行任何操作時(shí),調(diào)用clone是進(jìn)行的淺克隆。

既然實(shí)現(xiàn)Cloneable接口并重寫clone接口只能進(jìn)行淺克隆滔驶。但是如果類的引用類型屬性(以及屬性的引用類型屬性)都進(jìn)行淺克隆遇革,直到?jīng)]有引用類型屬性或者引用類型屬性為null時(shí),整體上就形成了深克隆揭糕。既對(duì)象的引用類型屬性和屬性的應(yīng)用類型屬性都實(shí)現(xiàn)Coloneable萝快,重寫clone方法并在clone方法中進(jìn)行調(diào)用。

protected Object clone() throws CloneNotSupportedException {
      Son result = (Son) super.clone();
    if (son != null) {
        result.son = (Son) son.clone();
    }
    return result;
}

二插佛、equals and hashCode

equals

equals 方法既然是基類 Object 的方法,我們創(chuàng)建的所有的對(duì)象都擁有這個(gè)方法量窘,并有權(quán)利去重寫這個(gè)方法雇寇。該方法返回一個(gè) boolean 值,代表比較的兩個(gè)對(duì)象是否相同蚌铜,這里的相同的條件由重寫 equals 方法的類來解決锨侯。

String str1 = "abc";
String str2 = "abc";
str1.equals(str2);//true

顯然 String 類一定重寫了 equals 方法否則兩個(gè) String 對(duì)象內(nèi)存地址肯定不同。


 public boolean equals(Object anObject) {
   //首先判斷兩個(gè)對(duì)象的內(nèi)存地址是否相同
   if (this == anObject) {
       return true;
   }
   // 判斷連個(gè)對(duì)象是否屬于同一類型冬殃。
   if (anObject instanceof String) {
       String anotherString = (String)anObject;
       int n = value.length;
       //長(zhǎng)度相同的情況下逐一比較 char 數(shù)組中的每個(gè)元素是否相同
       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;}
hashCode

hashCode()定義在JDK的Object.java中囚痴,這就意味著Java中的任何類都包含有hashCode() 函數(shù)。
hashCode()的作用是獲取hash值审葬,也稱為散列碼深滚;它實(shí)際上是返回一個(gè)int整數(shù)。這個(gè)hash值的作用是確定該對(duì)象在哈希表中的索引位置涣觉。也就是說hash值要在一些數(shù)據(jù)結(jié)構(gòu)中才能顯現(xiàn)作用痴荐。hashcode一般用在hashmap、hashset里官册,判斷要把數(shù)據(jù)放在數(shù)組的什么位置生兆。

下面,我們以HashSet為例膝宁,來深入說明hashCode()的作用鸦难。

假設(shè)根吁,HashSet中已經(jīng)有1000個(gè)元素。當(dāng)插入第1001個(gè)元素時(shí)合蔽,需要怎么處理击敌?因?yàn)镠ashSet是Set集合,它不允許有重復(fù)元素辈末。 “將第1001個(gè)元素逐個(gè)的和前面1000個(gè)元素進(jìn)行比較”愚争?顯然,這個(gè)效率是相等低下的挤聘。散列表很好的解決了這個(gè)問題轰枝,它根據(jù)元素的散列碼計(jì)算出元素在散列表中的位置,然后將元素插入該位置即可组去。對(duì)于相同的元素鞍陨,自然是只保存了一個(gè)。 由此可知从隆,若兩個(gè)對(duì)象相等诚撵,它們的散列碼一定相等;但反過來不一定键闺。在散列表中寿烟,
1、如果兩個(gè)對(duì)象相等辛燥,那么它們的hashCode()值一定要相同筛武。這里的相等是指,通過equals()比較兩個(gè)對(duì)象時(shí)返回true挎塌。
2徘六、如果兩個(gè)對(duì)象hashCode()相等,它們并不一定相等榴都。

轉(zhuǎn)自:http://www.reibang.com/p/cf164837f8ed


三待锈、getClass

getClass方法是獲得Class對(duì)象的方法之一

class A{
    public void func(){

    }
}

public class Test {
    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.getClass()); // class A
    }
}
反射學(xué)習(xí)

所謂反射,可以理解為在運(yùn)行時(shí)期獲取對(duì)象類型信息的操作嘴高。傳統(tǒng)的編程方法要求程序員在編譯階段決定使用的類型竿音,但是在反射的幫助下,編程人員可以動(dòng)態(tài)獲取這些信息拴驮,從而編寫更加具有可移植性的代碼谍失。嚴(yán)格地說,反射并非編程語言的特性莹汤,因?yàn)樵谌魏我环N語言都可以實(shí)現(xiàn)反射機(jī)制快鱼,但是如果編程語言本身支持反射,那么反射的實(shí)現(xiàn)就會(huì)方便很多。

Java反射機(jī)制主要提供了以下功能: 在運(yùn)行時(shí)判斷任意一個(gè)對(duì)象所屬的類抹竹;在運(yùn)行時(shí)構(gòu)造任意一個(gè)類的對(duì)象线罕;在運(yùn)行時(shí)判斷任意一個(gè)類所具有的成員變量和方法;在運(yùn)行時(shí)調(diào)用任意一個(gè)對(duì)象的方法窃判;生成動(dòng)態(tài)代理钞楼。

補(bǔ)充:獲取class對(duì)象的三種方式
  • 使用forName()方法:Class<?> clazz = Class.forName(className);
  • 調(diào)用屬性:Class<?> clazz = Person.class;
  • 利用對(duì)象調(diào)用Object的getClass方法Person p = new Person(); Class<?> clazz = p.getClass();

四、toString

toString()是Object類的一個(gè)公有方法袄琳,而所有類都繼承自O(shè)bject類询件。所以所有類即使不實(shí)現(xiàn)toString方法,也會(huì)存在從Object類繼承來的toString唆樊。

類可以實(shí)現(xiàn)toString方法宛琅,在控制臺(tái)中打印一個(gè)對(duì)象會(huì)自動(dòng)調(diào)用對(duì)象類的toString方法。打印的是對(duì)象名 + @換為十六進(jìn)制的對(duì)象的哈希值

public class Test {
    public static void main(String[] args){
        Car car1 = new Car("寶馬",300000.00);
        Car car2 = new Car("奔馳",500000.00);

        System.out.println(car1); // Car@4554617c
        System.out.println(car2); // Car@74a14482
    }
}

我們也可以實(shí)現(xiàn)自己從寫toString方法在控制臺(tái)中顯示關(guān)于類的有用信息逗旁。

@Override
public String toString() {
    return "Car{" +
            "name='" + name + '\'' +
            ", price=" + price +
            '}';
}
// 再次運(yùn)行上面的Test代碼得
// Car{name='寶馬', price=300000.0}
// Car{name='奔馳', price=500000.0}

八種基本數(shù)據(jù)類型沒有toString()方法嘿辟,只能使用相應(yīng)的包裝類才能使用toString()。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末片效,一起剝皮案震驚了整個(gè)濱河市红伦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌淀衣,老刑警劉巖昙读,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異膨桥,居然都是意外死亡蛮浑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門国撵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陵吸,“玉大人玻墅,你說我怎么就攤上這事介牙。” “怎么了澳厢?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵环础,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我剩拢,道長(zhǎng)线得,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任徐伐,我火速辦了婚禮贯钩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己角雷,他們只是感情好祸穷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勺三,像睡著了一般雷滚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吗坚,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天祈远,我揣著相機(jī)與錄音,去河邊找鬼商源。 笑死车份,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炊汹。 我是一名探鬼主播躬充,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼讨便!你這毒婦竟也來了充甚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤霸褒,失蹤者是張志新(化名)和其女友劉穎伴找,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體废菱,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡技矮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了殊轴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衰倦。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖旁理,靈堂內(nèi)的尸體忽然破棺而出樊零,到底是詐尸還是另有隱情,我是刑警寧澤孽文,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布驻襟,位于F島的核電站,受9級(jí)特大地震影響芋哭,放射性物質(zhì)發(fā)生泄漏沉衣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一减牺、第九天 我趴在偏房一處隱蔽的房頂上張望豌习。 院中可真熱鬧存谎,春花似錦、人聲如沸肥隆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巷屿。三九已至固以,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嘱巾,已是汗流浹背憨琳。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旬昭,地道東北人篙螟。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像问拘,于是被迫代替她去往敵國(guó)和親遍略。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350