摘要:好用的類在中,新增了一個工具類,就是類。事實上,我們進行比較的對象,除了引用對象之外,就是自動裝箱后等類型了。我們在重寫時,可以參考上面的類的寫法。
好用的java.util.Objects類
在jdk1.7中,新增了一個工具類,就是java.util.Objects類。它有3個簡單的封裝方法,對于平常的使用來說挺有用的,分別是:hashCode、equals、toString這3個方法。
1、hashcode生成// 1. Objects.hash(Object... values) public static int hash(Object... values) { return Arrays.hashCode(values); } // 2. Arrays.hashCode(Object a[]) public static int hashCode(Object a[]) { if (a == null) return 0; int result = 1; for (Object element : a) result = 31 * result + (element == null ? 0 : element.hashCode()); return result; } // 3. Object.hashCode() public native int hashCode();
首先,Objects的hash方法接收可變參數,可變參數的內部是一個數組。然后內部調用Arrays的hashCode方法,我們來看一下其方法:核心是遍歷每一個參數來計算result值,在計算的過程中,每一個參數上轉型為Object使用hashCode來生成隨機值。那么Object的hashCode又是什么?這是一個本地方法,源碼不給出實現,其數值和對象的內存地址有關。
參數雖然上轉型為Object,但是對于String、Integer等對象類型,它們都重寫了hashCode方法。2、對象equals比較因為是基于內存地址的生成,所以不同對象生成的hashcode值沖突的幾率是很小的。
// 1. Objects.equals(Object a, Object b) public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); } // 2. Object.equals(Object obj) public boolean equals(Object obj) { return (this == obj); }
首先是對象的引用判斷,其次就是調用對象自身的equals方法來比較,如果對象類型沒有重寫equals的話,就會調用Object的equals方法(仍然是對象的引用比較)。
hashCode與equals方法的重要性事實上,我們進行equals比較的對象,除了引用對象之外,就是String、Integer(自動裝箱后)等類型了。
對于String,直接進行引用比較。而對于Integer、Double等對象類型,它們都重寫了equals方法,貼出Integer的equals方法:
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }可以看到,內部是進行值相等判斷。
對于散列結構(hash)的集合類型,比如說HashMap、HashSet等,如果我們用它們來存儲我們自定義的對象,那么我們就必要重寫類的hashCode與equals方法。為什么要重寫,這個原因就不贅述了。 還有Set集合類,由于它存儲不重復的元素。
下面我們給出利用Objects工具類的一種較為簡單實用的重寫方式:
public class Building { private String name; private double area; @Override public int hashCode() { return Objects.hash(name, area); } @Override public boolean equals(Object obj) { // 引用相等判斷 if (obj == this) { return true; } // 類型判斷 if (!(obj instanceof Building)) { return false; } Building building = (Building) obj; // 關鍵域相等判斷 // 基本類型不要用用Objects.equals()方法,會自動裝箱帶來額外開銷 return Objects.equals(name, building.name) && (area == building.area); } @Override public String toString() { return Objects.toString("name = " + name, "name is undefined") + ", " + Objects.toString("area = " + area, "area is undefined"); } // setter、getter }3、toString
我們自己重寫toString方法時,有一點比較難寫,就是默認值設置。
// Objects.toString(Object o, String nullDefault) public static String toString(Object o, String nullDefault) { return (o != null) ? o.toString() : nullDefault; } // Objects.toStirng(Object 0) public static String toString(Object o) { return String.valueOf(o); }
我們在重寫toString時,可以參考上面的Building類的寫法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76704.html
摘要:在學習的源碼過程中我遇到了一些有趣有用的方法,在此之前如果要使用這些工具方法,我首先會想到的是和這樣的語言擴展包,但現在如果是寫一些,使用原生即可達到目的。 在學習JDK的源碼過程中我遇到了一些有趣有用的方法,在此之前如果要使用這些工具方法,我首先會想到的是commons-lang和guava這樣的語言擴展包,但現在如果是寫一些demo,使用原生即可達到目的。當然我們也不能否認它們的作...
摘要:時間年月日星期六說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章概述課程簡介本課程是在之前的初識微信公眾號開發課程基礎之上的。慕課網課程涵蓋前端開發等前沿技術語言,包括基礎課程實用案例高級分享三大類型,適合不同階段的學習人群。 時間:2017年08月12日星期六說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:http://img.m...
摘要:類是日期時間格式化子類的抽象類,我們通過這個類可以幫我們完成日期和文本之間的轉換也就是可以在對象與對象之間進行來回轉換。構造方法由于為抽象類,不能直接使用,所以需要常用的子類。 day01【Object類、常用API】 主要內容 Object類 Date類 DateFormat類 Calendar類 System類 StringBuilder類 包裝類 教學目標 -[ ] 能夠說出...
摘要:時間年月日星期二說明本文部分內容均來自慕課網。慕課網教學源碼學習源碼第一章觀察者模式概述課程簡介觀察者模式的定義定義對象間的一種一對多的依賴關系。 時間:2017年08月29日星期二說明:本文部分內容均來自慕課網。@慕課網:http://www.imooc.com教學源碼:https://github.com/zccodere/s...學習源碼:https://github.com/z...
摘要:存儲自定義類型鍵值集合保證是唯一的作為的元素必須重寫方法和方法以保證唯一存儲自定義類型鍵值類型類就必須重寫方法和方法以保證唯一類型可以重復創建集合往集合中添加元素女王英國秦始皇秦國普京俄羅斯女王毛里求斯使用和增強遍歷集合存儲自定義類型鍵 package com.itheima.demo02.Map; import java.util.HashMap;import java.util.M...
閱讀 959·2023-04-25 23:50
閱讀 1971·2021-11-19 09:40
閱讀 602·2019-08-30 13:50
閱讀 2731·2019-08-29 17:11
閱讀 1046·2019-08-29 16:37
閱讀 2990·2019-08-29 12:54
閱讀 2798·2019-08-28 18:17
閱讀 2643·2019-08-26 16:55