Java开发必备:Object类核心方法使用场景与重写技巧
鍝庯紝鍚勪綅鍒氬叆闂↗ava鐨勫皬浼欎即浠紝浣犱滑鏈夋病鏈夐亣鍒拌繃杩欑鎯呭喌锛熸槑鏄庤嚜宸卞啓鐨勪袱涓璞″睘鎬у€间竴妯′竴鏍凤紝浣嗙敤"=="姣旇緝灏辨槸杩斿洖false锛熸垨鑰呮妸瀵硅薄濉炶繘HashSet闆嗗悎鏃讹紝鑾悕鍏跺鍑虹幇閲嶅鏁版嵁锛熶粖澶╁挶浠氨鏉ユ墥涓€鎵掕棌鍦↗ava鍩哄洜閲岀殑鑰佺瀹椻€斺€擮bject绫伙紝鎵嬫妸鎵嬫暀浣犳€庝箞鐜╄浆瀹冪殑鏍稿績鏂规硶锛?/p>
鈥?strong>鈥嬩竴銆佷竾鐗╄捣婧愶細涓轰粈涔堟瘡涓狫ava瀵硅薄閮借璺嫓Object锛熲€?/strong>鈥?br/> 浣犻€犲悧锛烰ava涓栫晫閲屾墍鏈夌被閮芥槸Object鐨?寰掑瓙寰掑瓩"锛屽氨杩炰綘闅忔墜鍐欑殑"HelloWorld"绋嬪簭閲岀殑閭d釜main绫伙紝鍏跺疄鏆楁埑鎴崇户鎵夸簡Object銆傝繖灏卞ソ姣旀渚犲皬璇撮噷鐨勬壂鍦板儳锛屽钩鏃朵笉璧风溂锛屼絾鍏抽敭鏃跺埢鑳芥晳鍛斤紒
涓句釜鏍楀瓙馃尠锛?/p>
java澶嶅埗public class Cat { String name; } // 瀹為檯绛変环浜?/span> public class Cat extends Object { String name; }
杩欐椂鍊欒偗瀹氭湁灏忎紮浼磋闂細閭g户鎵縊bject鍒板簳鏈夊暐鐢ㄥ晩锛熷挶浠線涓嬬湅锛?/p>
鈥?strong>鈥嬩簩銆佷笁澶ф姢娉曟柟娉曪細equals銆乭ashCode銆乼oString鐨勬睙婀栬鐭┾€?/strong>鈥?/p>
鈥?strong>鈥?. equals鏂规硶锛氫綘浠ヤ负鐨勭浉绛変笉涓€瀹氭槸鐪熺浉绛夆€?/strong>鈥?br/> 鏂版墜鏈€瀹规槗韪╃殑鍧戝氨鏄洿鎺ョ敤"=="姣旇緝瀵硅薄銆傛潵锛屽挶浠仛涓疄楠岋細
java澶嶅埗String s1 = new String("鍠垫槦浜?); String s2 = new String("鍠垫槦浜?); System.out.println(s1 == s2); // 杈撳嚭false System.out.println(s1.equals(s2)); // 杈撳嚭true
鐪嬪埌娌★紵鈥?strong>鈥?=姣旇緝鐨勬槸鍐呭瓨鍦板潃鈥?/strong>鈥嬶紝鑰宔quals鎵嶆槸姣斿唴瀹广€備絾娉ㄦ剰锛丱bject鑷甫鐨別quals榛樿涔熸槸鐢?=姣旇緝锛屾墍浠ュ挶浠粡甯歌閲嶅啓瀹冦€?/p>
鈥?strong>鈥嬮噸鍐欏璺ā鏉匡細鈥?/strong>鈥?/p>
java澶嶅埗@Override public boolean equals(Object o) { // 1. 鏄笉鏄悓涓€涓璞?/span> if (this == o) return true; // 2. 鏄笉鏄痭ull鎴栬€呯被鍨嬩笉瀵?/span> if (o == null || getClass() != o.getClass()) return false; // 3. 寮哄埗绫诲瀷杞崲鍚庨€愪釜瀛楁姣旇緝 Cat cat = (Cat) o; return Objects.equals(name, cat.name); }
鈥?strong>鈥?. hashCode锛氳繖涓暟瀛楄兘鍐冲畾瀵硅薄鐨勭敓姝诲瓨浜♀€?/strong>鈥?br/> 寰堝灏忕櫧瑙夊緱杩欎釜鏂规硶鑾悕鍏跺锛岀洿鍒伴亣鍒癏ashSet/HashMap鐨勭伒寮備簨浠讹細
java澶嶅埗Set
cats = new HashSet<>(); cats.add(new Cat("姗樺骇")); cats.add(new Cat("姗樺骇")); System.out.println(cats.size()); // 杈撳嚭2锛燂紒
杩欏氨鏄病鍚屾椂閲嶅啓equals鍜宧ashCode鐨勫悗鏋滐紒鈥?strong>鈥媓ashCode鐩稿綋浜庡璞$殑韬唤璇佸彿鈥?/strong>鈥嬶紝鍝堝笇闆嗗悎鍏堢敤杩欎釜鍙峰揩閫熷畾浣嶏紝鍐嶇敤equals纭銆?/p>
鈥?strong>鈥嬮粍閲戞惌妗h鍒欙細鈥?/strong>鈥?/p>
- 涓や釜瀵硅薄equals涓簍rue 鈫?hashCode蹇呴』鐩稿悓
- hashCode鐩稿悓 鈫?瀵硅薄涓嶄竴瀹氱浉绛?/li>
鈥?strong>鈥?. toString锛氱▼搴忓憳鐨勫悗鎮旇嵂鈥?/strong>鈥?br/> 璋冭瘯鏃剁湅鐫€鎺у埗鍙拌緭鍑虹殑"Cat@1b6d3586"锛屾槸涓嶆槸鎯崇牳閿洏锛熼噸鍐檛oString灏辨槸浣犵殑鏁戝懡绋昏崏锛?/p>
java澶嶅埗@Override public String toString() { return "鐚富瀛愬皧濮撳ぇ鍚嶏細" + name; }
鈥?strong>鈥嬩笁銆侀噸鍐欐妧宸х孩榛戞锛堣〃鏍煎姣旓級鈥?/strong>鈥?/p>
鈥?strong>鈥嬫搷浣溾€?/strong>鈥?/th> | 鈥?strong>鈥嬫纭Э鍔库渽鈥?/strong>鈥?/th> | 鈥?strong>鈥嬩綔姝昏涓衡潓鈥?/strong>鈥?/th> |
---|---|---|
閲嶅啓equals | 鍏堝垽鏂被鍨嬶紝鍐嶉€愪釜姣旇緝鍏抽敭瀛楁 | 鐩存帴instanceof鍒ゆ柇鐖剁被 |
hashCode鐢熸垚 | 浣跨敤Objects.hash()缁勫悎瀛楁 | 鐩存帴杩斿洖鍥哄畾鍊?/td> |
toString鏍煎紡 | 鍖呭惈鍏抽敭涓氬姟瀛楁 | 鏆撮湶鏁忔劅淇℃伅锛堝瀵嗙爜銆佹墜鏈哄彿锛?/td> |
绌烘寚閽堝鐞?/td> | 鎶婂凡鐭ラ潪null瀵硅薄鏀緀quals鏂规硶宸﹁竟 | 鍙傛暟瀵硅薄鍙兘涓簄ull鏃朵笉妫€鏌?/td> |
鈥?strong>鈥嬪洓銆佺伒榄傛嫹闂幆鑺傦細閭d簺骞存垜浠俯杩囩殑鍧戔€?/strong>鈥?/p>
鈥?strong>鈥婹锛氫负浠€涔堣鍚屾椂閲嶅啓equals鍜宧ashCode锛熲€?/strong>鈥?br/> A锛氬亣璁句綘閲嶅啓浜唀quals浣嗘病鏀筯ashCode锛屽綋涓や釜瀵硅薄equals涓簍rue浣唄ashCode涓嶅悓鏃讹紝鏀惧湪HashMap閲屽氨浼氳瀛樺埌涓嶅悓浣嶇疆锛屽鑷村彇鏁版嵁鏃舵壘涓嶅埌瀵硅薄锛屽氨鍍忔妸閽ュ寵鍜岄攣鏀惧湪涓嶅悓鐨勪繚闄╃銆?/p>
鈥?strong>鈥婹锛歠inalize鏂规硶鐪熺殑鍙互鐢ㄦ潵鎷晳瀵硅薄鍚楋紵鈥?/strong>鈥?br/> A锛氬埆澶╃湡浜嗭紒杩欎釜鏂规硶铏界劧鐪嬬潃鍍忔晳鍛界ɑ鑽夛紝浣咼VM鍘嬫牴涓嶄繚璇佷粈涔堟椂鍊欒皟鐢ㄥ畠銆傜幇鍦ㄨ繛瀹樻柟鏂囨。閮借杩欐柟娉曞熀鏈槸鎽嗚锛岄噸瑕佽祫婧愰噴鏀捐繕鏄闈爐ry-with-resources銆?/p>
鈥?strong>鈥嬩釜浜鸿鐐规椂闂粹€?/strong>鈥?br/> 骞蹭簡杩欎箞澶氬勾Java锛屾垜鍙戠幇寰堝鏂版墜瀹规槗鍦ㄥ熀纭€鏂规硶涓婄炕杞︺€傚叾瀹濷bject绫荤殑鏂规硶灏卞儚鍐呭姛蹇冩硶锛岀湅璧锋潵骞冲钩鏃犲锛屼絾姣忎釜楂樻墜閮芥槸鍦ㄨ繖浜涘熀纭€鎷涙暟涓婄粌鍑烘潵鐨勩€傜壒鍒槸鐜板湪闈㈣瘯瀹樺氨鐖辩洴鐫€杩欎簺缁嗚妭闂紝涓婃鏈変釜灏忎紮浼村氨鍥犱负璇翠笉娓卙ashCode鐨勪綔鐢紝鐩存帴琚玴ass鎺変簡銆?/p>
璁颁綇鍟婂悇浣嶏紝鍐欎唬鐮佹椂澶氭兂鎯筹細"濡傛灉鎴戞槸Object鐨勮璁¤€咃紝浼氭€庝箞璁捐杩欎簺鏂规硶锛? 鐞嗚В浜嗚繖涓簳灞傞€昏緫锛屼粈涔堟鏋躲€佽璁℃ā寮忛兘鏄湪杩欏熀纭€涓婄殑鑺辨嫵缁h吙銆備笅娆¢亣鍒板璞℃瘮杈冪殑bug鏃讹紝甯屾湜浣犺兘鑷俊鍦扮敥鍑猴細"灏忔牱锛岀湅鎴戦噸鍐欎釜equals娌讳綘锛?
本文由嘻道妙招独家原创,未经允许,严禁转载