Java在重載中使用Object的問題
在重載中使用Object
JAVA中調用重載方法都是先匹配同類型參數的方法,如沒有才會向上轉型去匹配參數。
例:
public void remove(int i) { ... } public void remove(Object object) { ... }
int i = 0; Integer it = 0; remove(i); //調用瞭 remove(int i) 方法 remove(it); //調用瞭 remove(Object object) 方法
在開發中遇到瞭兩個方法
public boolean lSet(List<Object> value) { ... } public boolean lSet(Object) { ... }
調用時:
List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); lSet(list); //調用瞭lSet(Object)
調用瞭lSet(Object) 而不是lSet(List<Object> value)
不是說先匹配類型相同的嗎?
註意重載方法中的參數List<Object> value List指定瞭泛型Object,但調用時傳入的是List<Integer>此時並不算同一種類型。
解決辦法
//使用?通配符 或 直接不指定泛型 public boolean lSet(List<?> value) { ... }
Object的使用:重載equals、hashCode及實現compareTo
這裡主要介紹Java中使用Hashtable、Arrays.sort時候如果鍵值涉及到對象、類時候的處理辦法:
1.重載equals():java中默認的對象的equals是當指向同一內存地址時才為true;如果你現在需要利用對象裡面的值來判斷是否相等,則重載equal方法。
2.重載hashCode():隻有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會重載hashCode,原因:就HashMap來說,好比HashMap就是一個大內存塊,裡面有很多小內存塊,小內存塊裡面是一系列的對象,可以利用hashCode來查找小內存塊hashCode%size(小內存塊數量),所以當equal相等時,hashCode必須相等,而且如果是object對象,必須重載hashCode和equal方法。
3.實現接口Comparable:當需要調用sort()之類的函數要用到對象的比較的基本操作時候,就需要對Object的compareTo(Object arg0)進行實現。
4.binarySearch使用註意:由於Arrays.binarySearch(Object array[],Object key)中沒有給定查找數組的范圍,據我估計可能是0到length-1,因而數組最好是都能填滿對象,如果部分為空(數組開的過大)則會出錯。而且搜索前要調用sort函數排序一下。因為數組長度和對象個數相同,所以sort(Object [])也不用給定范圍而全部排序。
下面是一個簡單的例子
public class TermPOS implements Comparable{ public String term; public String pos; public TermPOS(String a,String b) { term = a; pos = b; } //用於調用Arrays.sort(Object[])時的自定義大小,此時類後加上implements Comparable public int compareTo(Object arg0) { // TODO 自動生成方法存根 if(this.term.compareTo(((TermPOS)arg0).term) != 0) return this.term.compareTo(((TermPOS)arg0).term); return this.pos.compareTo(((TermPOS)arg0).pos); } //當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會重載hashCode public int hashCode() { return term.hashCode()*pos.hashCode(); } //如果你現在需要利用對象裡面的值來判斷是否相等,則重載equal方法 public boolean equals(Object obj) { if(term.compareTo(((TermPOS)obj).term) != 0)return false; if(pos.compareTo(((TermPOS)obj).pos) != 0)return false; return true; } public static void testHashtable() { Hashtable<TermPOS,Integer> t = new Hashtable<TermPOS,Integer>(); TermPOS x = new TermPOS("a","b"); t.put(new TermPOS("a","b"), 2); if(t.get(x) == null)System.out.println("wrong!"); //當去掉hashCode的重寫後就輸出這個 else System.out.println(t.get(x)); System.out.println(x.equals(new TermPOS("a","b"))); } public static void testSort() { TermPOS tp[] = new TermPOS[3]; tp[0] = new TermPOS("b","c"); tp[1] = new TermPOS("a","c"); tp[2] = new TermPOS("a","b"); Arrays.sort(tp,0,3); for(int i = 0;i < 3;i ++) System.out.println(tp[i].term+"\t"+tp[i].pos); } /** * @param args * @throws IOException */ public static void main(String[] args) throws IOException { // TODO 自動生成方法存根 testHashtable(); testSort(); } }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- Java 基礎–Arrays工具類詳解
- Java開發中最讓人頭疼的十個bug
- Java基礎之淺談hashCode()和equals()
- 新手初學Java集合框架
- 深入淺出講解Java集合之Collection接口