Java在重載中使用Object的問題
在重載中使用Object
JAVA中調(diào)用重載方法都是先匹配同類型參數(shù)的方法,如沒有才會向上轉型去匹配參數(shù)。
例:
public void remove(int i) { ?? ?... } public void remove(Object object) { ?? ?... }
?? ?int i = 0; ?? ?Integer it = 0; ?? ?remove(i); //調(diào)用了 remove(int i) 方法 ?? ?remove(it); //調(diào)用了 remove(Object object) 方法
在開發(fā)中遇到了兩個方法
public boolean lSet(List<Object> value) { ?? ?... } public boolean lSet(Object) { ?? ?... }
調(diào)用時:
?? ?List<Integer> list = new ArrayList<>(); ?? ?list.add(1); ?? ?list.add(2); ?? ?lSet(list); ?//調(diào)用了lSet(Object)
調(diào)用了lSet(Object) 而不是lSet(List<Object> value)
不是說先匹配類型相同的嗎?
注意重載方法中的參數(shù)List<Object> value List指定了泛型Object,但調(diào)用時傳入的是List<Integer>此時并不算同一種類型。
解決辦法
//使用?通配符 或 直接不指定泛型 public boolean lSet(List<?> value) { ?? ?... }
Object的使用:重載equals、hashCode及實現(xiàn)compareTo
這里主要介紹Java中使用Hashtable、Arrays.sort時候如果鍵值涉及到對象、類時候的處理辦法:
1.重載equals():java中默認的對象的equals是當指向同一內(nèi)存地址時才為true;如果你現(xiàn)在需要利用對象里面的值來判斷是否相等,則重載equal方法。
2.重載hashCode():只有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會重載hashCode,原因:就HashMap來說,好比HashMap就是一個大內(nèi)存塊,里面有很多小內(nèi)存塊,小內(nèi)存塊里面是一系列的對象,可以利用hashCode來查找小內(nèi)存塊hashCode%size(小內(nèi)存塊數(shù)量),所以當equal相等時,hashCode必須相等,而且如果是object對象,必須重載hashCode和equal方法。
3.實現(xiàn)接口Comparable:當需要調(diào)用sort()之類的函數(shù)要用到對象的比較的基本操作時候,就需要對Object的compareTo(Object arg0)進行實現(xiàn)。
4.binarySearch使用注意:由于Arrays.binarySearch(Object array[],Object key)中沒有給定查找數(shù)組的范圍,據(jù)我估計可能是0到length-1,因而數(shù)組最好是都能填滿對象,如果部分為空(數(shù)組開的過大)則會出錯。而且搜索前要調(diào)用sort函數(shù)排序一下。因為數(shù)組長度和對象個數(shù)相同,所以sort(Object [])也不用給定范圍而全部排序。
下面是一個簡單的例子
public class TermPOS implements Comparable{ ? ? public String term; ? ? public String pos; ? ? public TermPOS(String a,String b) ? ? { ? ? ? ? term = a; ? ? ? ? pos = b; ? ? } ? ? //用于調(diào)用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(); ? ? } ? ? //如果你現(xiàn)在需要利用對象里面的值來判斷是否相等,則重載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(); ? ? } }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
java字符串的替換replace、replaceAll、replaceFirst的區(qū)別說明
這篇文章主要介紹了java字符串的替換replace、replaceAll、replaceFirst的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03