日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你所忽略的,覆盖equals时需要注意的事项《effective java》

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你所忽略的,覆盖equals时需要注意的事项《effective java》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  我們都知道Object的equals的比較其實就是==的比較,其實是內存中的存放地址的比較。正常邏輯上:類的每個實例本質上都是唯一的。

  在工作中我們實際的業務邏輯往往有可能出現一些相對特殊的需求需要對equals方法進行重寫,那么重寫equals需要注意哪些規則或者通用的約定呢?

?

equals方法實現了等價關系(equivalence relation):

  • 自反性(reflexive)。對于任何非null的引用值x,x.equals(x)必須返回true。
  • 對稱性(symmetric)。對于任何非null的引用值x和y,當且僅當y.equals(x)返回true時,x.equals(y)必須返回true。
  • 傳遞性(transitive)。對于任何非null的引用值x、y和z。如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也必須返回true。
  • 一致性(consistent)。對于任何非null的引用值x和y,只要equals的比較操作在對象中所用的信息沒有被修改,多次調用x.equals(x)就會一致地返回true,或者一致的返回false。
  • 對于任何非null的引用值x,x.equals(null)必須返回false。

第一點自反性不需要多說,基本上不可能會出現違背這條約定的情況當自己和自己比較的時候返回false。

第二點對稱性,這種情況還是有可能會出現的。我們可以假設一個場景,這個場景是我們創建一個類并且里面只有一個String屬性字段,這個類需要實現的是可以不區分字符串的大小寫。

pubilc final class IgnoreCaseString {private final String s;public IgnoreCaseString(String s) {if (s == null)throw new NullPointerException();this.s = s;}@Overridepublic boolean equals(Object o) {if (o instanceof IgnoreCaseString)return s.equalsIgnoreCase(((IgnoreCaseString) o).s);if (o instanceof String)return s.equalsIgnoreCase((String) o);return false;}

  ...//更多代碼(重寫equals就需要重寫hashCode) }

在這個類中,equals方法的意圖非常好,它的企圖是可以與普通的字符串對象進行互操作。但是這段代碼無意中觸犯了對稱性這個約定,從new?IgnoreCaseString(“Po”).equals("po")是為true的,但是反過來“po”.equals(new IgnoreCaseString("Po"))的結果是false。假如違反了這一情況而沒有去更正,他會破壞已有的集合框架的一些方法,使其變的不在準確。

IgnoreCaseString ics = new IgnoreCaseString("Po");List<IgnoreCaseString> list = new ArrayList<IgnoreCaseString>();list.add(ics);System.out.println(list.contains("po"));List<String> list1 = new ArrayList<>();list1.add("po");System.out.println(list1.contains(ics));

結果是,此時list.contains(s)會返回什么結果呢?沒人知道,在Sun的當前實現中,它碰巧返回false,但這只是這個特定實現得出的結果而已。在其他的實現中,它有可能返回true(如上面代碼中的list1.contains(ics)),或者拋出一個運行時(runtime)異常。一旦違反了equals約定,當其他對象面對你的對象時,你完全不知道這些對象的行為會這么樣。

第三點傳遞性,equals約定:如果一個對象等于第二個對象,并且第二個對象又等于第三個對象,則第一個對象一定等于第三個對象。無意識違反這一情況其實不難想象,考慮子類的情形,子類增加的信息會影響到equals的比較結果。

public class TwoDCoordinate {private final int x;private final int y;public TwoDCoordinate(int x, int y) {this.x = x;this.y = y;}@Overridepublic boolean equals(Object o) {if (!(o instanceof TwoDCoordinate))return false;TwoDCoordinate p = (TwoDCoordinate)o;return p.x == x && p.y == y;}
  ...//更多代碼
(重寫equals就需要重寫hashCode) }
public class ThreeDCoordinate extends TwoDCoordinate{
  
private final int z;
  
public ThreeDCoordinate(int x, int y, int z) {
    
super(x, y); this.z=z;
  }

  @Override
  
public boolean equals(Object o) {
    
if (!(o instanceof TwoDCoordinate))
      
return false;
    
if (!(o instanceof ThreeDCoordinate))
      
return o.equals(this);
    
return super.equals(o) && this.z == ((ThreeDCoordinate) o).z;
  }
  
  ...//更多代碼
(重寫equals就需要重寫hashCode) } ThreeDCoordinate t1 = new ThreeDCoordinate(1, 2, 3);TwoDCoordinate t2 = new TwoDCoordinate(1, 2);ThreeDCoordinate t3 = new ThreeDCoordinate(1, 2, 4);System.out.println(t1.equals(t2));System.out.println(t2.equals(t1));System.out.println(t2.equals(t3));System.out.println(t1.equals(t3));

結果是true??true? ?true? ?false,上述代碼已經滿足了自反性和對稱性的約定,但是沒有滿足傳遞性,t1.equals(t2)為true,t2.equals(t3)為true,t1.equals(t3)卻為false。

這種情況很多程序員會犯。

?想要避免這種情況,其實可以用getClass測試代替instanceof測試。如將TwoDCoordinate 的equals 方法改為

public boolean equals(Object o) {if (o == null || o.getClass() != this.getClass())return false;TwoDCoordinate p = (TwoDCoordinate)o;return p.x == x && p.y == y;}

這種替代方式其實不會太糟糕,但是結果卻不會太理想,暫時沒有想到令人滿意的辦法實現既可以擴展又不可實例化的類,但是可以考慮復合優先于繼承。

第四點一致性,equals約定的第四個要求是,如果兩個對象相等,它們就必須始終保持相等,除非它們中有一個對象(或者兩個都)被修改了。換句話說,可變對象在不同的時候可以與不同的對象相等,而不可變對象則不會這樣。當你在寫一個類的時候,應該仔細考慮她是否應該是不可變的。如果認為它應該是不可變的,就必須保證equals方法滿足這樣的限制條件:相等的對象永遠相等,不相等的對象永遠不相等。

?

轉載于:https://www.cnblogs.com/saoyou/p/10318517.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的你所忽略的,覆盖equals时需要注意的事项《effective java》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕一区视频 | 一级做a在线观看 | 911福利视频 | 草草影院最新地址 | 深夜福利影院 | 日韩av毛片在线观看 | 国产色无码精品视频 | v天堂在线观看 | 国产成人精品亚洲男人的天堂 | 特级淫片裸体免费看冫 | 久久爱成人 | 中文在线一区二区三区 | 中文字幕成人动漫 | 精品日韩一区二区三区四区 | 偷拍夫妻性生活 | 亚洲国产无码精品 | 午夜视频福利 | 手机在线观看毛片 | 国产毛片毛片毛片毛片毛片毛片 | 中文字幕国产日韩 | jzzijzzij亚洲成熟少妇18 欧美www在线观看 | 国产精品传媒一区二区 | 日韩亚洲第一页 | 国产小视频在线免费观看 | 四季av中文字幕一区 | 欧美爽爽爽 | 麻豆精品国产传媒av | 噜噜噜久久,亚洲精品国产品 | 一区二区三区日韩欧美 | 欧美理论片在线观看 | 九九九九精品九九九九 | 91精品国产91久久久 | 黄色美女片 | 白丝美女被草 | 日韩电影网站 | 九九久久99 | 久久爱综合网 | 日韩一级片免费观看 | 中文字幕国产一区二区 | 国产在线自| 国产伦精品视频一区二区三区 | 日韩视频网站在线观看 | 丁香婷婷深情五月亚洲 | 97夜夜 | 久操视频在线观看免费 | 在线观看高清视频 | 182午夜视频| 国产原创视频在线观看 | 91精品大片| 九一国产视频 | 超碰超碰在线 | 在线观看免费视频一区 | 日韩毛片一区二区三区 | 四虎影院黄色 | 天天躁日日躁狠狠躁欧美 | 理论片一级 | 你懂的成人 | 中文字幕精品三级久久久 | 国产精品久久久久永久免费看 | 草1024榴社区成人 | 91午夜在线观看 | 天天干夜夜爽 | 亚洲国产天堂av | 91精品99| 西西444www大胆无视频 | 69视频网站| 中文字幕一区二区三区人妻四季 | 亚洲深夜| 亚洲一区二区人妻 | 爱情岛论坛亚洲自拍 | 久久久久久久久99 | 成年人黄国产 | 国产美女精品久久久 | 91黄色免费观看 | 亚洲综合国产精品 | 96毛片| 九色视频丨porny丨丝袜 | 国产精品午夜福利视频234区 | 在线观看国产精品视频 | 成人1区 | 精品人妻少妇嫩草av无码专区 | 国产又爽又黄的视频 | 成长快手短视频在线观看 | 精品人妻一区二区三区四区 | av中文字幕一区二区三区 | 性插插视频 | 操少妇视频 | 久久午夜网 | 亚州福利 | 日日夜夜撸撸 | 欧美嫩草| 人妻一区在线 | 91偷拍精品一区二区三区 | 一级黄色在线观看 | 精品美女 | 末发成年娇小性xxxxx | 久久久久久久久99精品 | 成人精品久久久 | 国产三级aaa |