1.1.2.5 HashTable類
HashTable類不緊可以像Vector類一樣動(dòng)態(tài)的存儲(chǔ)一系列的對象,而且對存儲(chǔ)的每一個(gè)對象(稱為值)都安排另一個(gè)對象(稱為關(guān)鍵字)與它相關(guān)聯(lián)。
用做關(guān)鍵字的類必須覆蓋Object.hashCode方法和Object.equals方法,
因?yàn)橐〕鰯?shù)據(jù)時(shí),傳遞給get()方法的參數(shù)要跟里面的關(guān)鍵字比較,這時(shí)就要使用equals()方法。另外如果這兩個(gè)關(guān)鍵字相等,他們的hashcode()返回值也要相等。
編程舉例:使用自定義類作為hashtable()關(guān)鍵字的類。
public class MyKey
{
String name=null;
int age=0;
public boolean equals(Object obj) //作為關(guān)鍵字的類要覆蓋該方法
{
if(obj instanceof MyKey) //如果它是mykey類型的,則先要轉(zhuǎn)換為mykey類型,因?yàn)榫幾g器不知道他是什么類型的
{
MyKey objtemp=(MyKey)obj; //然后下面再比較里面的內(nèi)容是否相等。
if(name.equals(objtemp.name)&&age==objtemp.age)
{
return true; //如果內(nèi)容也相等,則相等
}
else
{
return false; //否則不等
}
}
else
{
return false; //如果它不是mykey類型的,則肯定不相等,因?yàn)轭愋投疾煌?/P>
}
}
public int hashCode() //作為關(guān)鍵字的類要覆蓋該方法
{
return name.hashCode()+age; //因?yàn)閟tring類已經(jīng)覆蓋了hashcode()方法,stringbuffer類沒有覆蓋該方法,所以不可以用做關(guān)鍵字類。
//如果name和age有一個(gè)不等,返回值則不等
}
public MyKey(String name,int age) //覆蓋構(gòu)造函數(shù)
{
this.name=name;
this.age=age;
}
public String toString() //如果不覆蓋這個(gè)方法,則會(huì)產(chǎn)生亂碼
{
return name+","+age;
}
}
import java.util.*;
public class HashTableTest
{
public static void main(String[] args)
{
Hashtable numbers=new Hashtable(); //新建一個(gè)hashtable類的實(shí)例
numbers.put(new MyKey("ZhangSan",18),new Integer(1)); 裝入數(shù)據(jù)
numbers.put(new MyKey("LiSi",20),new Integer(2));
numbers.put(new MyKey("WangWu",16),new Integer(3));
Enumeration e=numbers.keys();
while(e.hasMoreElements())
{
MyKey Key=(MyKey)e.nextElement();
System.out.print(Key+"=");
System.out.println(numbers.get(Key));
}
}
}
相關(guān)推薦:計(jì)算機(jī)等級(jí)考試二級(jí)Java經(jīng)典算法大全匯總北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |