Hashtable類

創(chuàng)新互聯(lián)是專業(yè)的建水網(wǎng)站建設(shè)公司,建水接單;提供成都網(wǎng)站設(shè)計、做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行建水網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
Hashtable繼承Map接口,實現(xiàn)一個key-value映射的哈希表。任何非空(non-null)的對象都可作為key或者value。
添加數(shù)據(jù)使用put(key,
value),取出數(shù)據(jù)使用get(key),這兩個基本操作的時間開銷為常數(shù)。
Hashtable通過initial capacity和load
factor兩個參數(shù)調(diào)整性能。通常缺省的load factor
0.75較好地實現(xiàn)了時間和空間的均衡。增大load
factor可以節(jié)省空間但相應(yīng)的查找時間將增大,這會影響像get和put這樣的操作。
使用Hashtable的簡單示例如下,將1,2,3放到Hashtable中,他們的key分別是”one”,”two”,”three”:
Hashtable numbers = new
Hashtable();
numbers.put(“one”,
new Integer(1));
numbers.put(“two”, new
Integer(2));
numbers.put(“three”,
new Integer(3));
要取出一個數(shù),比如2,用相應(yīng)的key:
Integer
n = (Integer)numbers.get(“two”);
System.out.println(“two = ”
+ n);
由于作為key的對象將通過計算其散列函數(shù)來確定與之對應(yīng)的value的位置,因此任何作為key的對象都必須實現(xiàn)hashCode和equals方法。hashCode和equals方法繼承自根類Object,如果你用自定義的類當作key的話,要相當小心,按照散列函數(shù)的定義,如果兩個對象相同,即obj1.equals(obj2)=true,則它們的hashCode必須相同,但如果兩個對象不同,則它們的hashCode不一定不同,如果兩個不同對象的hashCode相同,這種現(xiàn)象稱為沖突,沖突會導(dǎo)致操作哈希表的時間開銷增大,所以盡量定義好的hashCode()方法,能加快哈希表的操作。
如果相同的對象有不同的hashCode,對哈希表的操作會出現(xiàn)意想不到的結(jié)果(期待的get方法返回null),要避免這種問題,只需要牢記一條:要同時復(fù)寫equals方法和hashCode方法,而不要只寫其中一個。
Hashtable是同步的
public class Test { /*創(chuàng)建類*/
public static void main(String[] args) {
System.out.println(dg(100));
}
static int dg(int i) { /*定義變量 */
int sum;
if (i == 1) /*假設(shè)條件*/
return 1;
else
sum = i + dg(i - 1); /*1~100的和的表達式*/
return sum; /*返回結(jié)果*/
}
}
這個腳本語言為 Internet 應(yīng)用而生,它可以看作是 Haskell 和 Java 的結(jié)合。
HashMap是無序的集合,對里面的元素進行排序,需要借助其他有序的集合
傳統(tǒng)的思路: ? 把每一個HashMap的鍵值對作為一個Entry 存入到ArrayListEntry里. ?然后對ArrayList進行排序.
Java8新思路: 利用流對集合進行處理,非常強大, 如果配合上Lambda表達式, 就是簡潔且強大.
參考代碼
import?java.util.HashMap;
//java8?流處理
public?class?Demo1?{
public?static?void?main(String[]?args)?{
HashMapString,?Integer?map?=?new?HashMap();
map.put("lucy",?76);
map.put("tom",?92);
map.put("jack",?86);
//?按照?Key?(名字)進行排序?,并打印
map.entrySet().stream().sorted((e1,?e2)?-?e1.getKey().compareTo(e2.getKey())).forEach(System.out::println);
System.out.println("-------分割線----------");
//?按照value(分數(shù))?進行排序,并打印
map.entrySet().stream().sorted((e1,?e2)?-?e1.getValue().compareTo(e2.getValue())).forEach(System.out::println);
}
}
#include stdio.h
#include string.h
#include stdlib.h
//#include
#define HASH_LEN 50 //哈希表的長度
#define M 47
#define NAME_NO 30 //人名的個數(shù)
typedef struct NAME
{
char *py; //名字的拼音
int k; //拼音所對應(yīng)的整數(shù)
}NAME;
NAME NameList[HASH_LEN];
typedef struct hterm //哈希表
{
char *py; //名字的拼音
int k; //拼音所對應(yīng)的整數(shù)
int si; //查找長度
}HASH;
HASH HashList[HASH_LEN];
/*-----------------------姓名(結(jié)構(gòu)體數(shù)組)初始化---------------------------------*/
void InitNameList()
{
NameList[0].py="chenghongxiu";
NameList[1].py="yuanhao";
NameList[2].py="yangyang";
NameList[3].py="zhanghen";
NameList[4].py="chenghongxiu";
NameList[5].py="xiaokai";
NameList[6].py="liupeng";
NameList[7].py="shenyonghai";
NameList[8].py="chengdaoquan";
NameList[9].py="ludaoqing";
NameList[10].py="gongyunxiang";
NameList[11].py="sunzhenxing";
NameList[12].py="sunrongfei";
NameList[13].py="sunminglong";
NameList[14].py="zhanghao";
NameList[15].py="tianmiao";
NameList[16].py="yaojianzhong";
NameList[17].py="yaojianqing";
NameList[18].py="yaojianhua";
NameList[19].py="yaohaifeng";
NameList[20].py="chengyanhao";
NameList[21].py="yaoqiufeng";
NameList[22].py="qianpengcheng";
NameList[23].py="yaohaifeng";
NameList[24].py="bianyan";
NameList[25].py="linglei";
NameList[26].py="fuzhonghui";
NameList[27].py="huanhaiyan";
NameList[28].py="liudianqin";
NameList[29].py="wangbinnian";
char *f;
int r,s0;
for (int i=0;iNAME_NO;i++)
{
s0=0;
f=NameList[i].py;
for (r=0;*(f+r) != NULL;r++) //方法:將字符串的各個字符所對應(yīng)的ASCII碼相加,所得的整數(shù)做為哈希表的關(guān)鍵字
s0=*(f+r)+s0;
NameList[i].k=s0;
}
}
/*-----------------------建立哈希表---------------------------------*/
void CreateHashList()
{
for (int i=0; iNAME_NO; i ++)
{
HashList[i].py="";
HashList[i].k=0;
HashList[i].si=0;
}
for (i=0; i NAME_NO ; i++)
{
int sum=0;
int adr=(NameList[i].k) % M; //哈希函數(shù)
int d=adr;
if(HashList[adr].si==0) //如果不沖突
{
HashList[adr].k=NameList[i].k;
HashList[adr].py=NameList[i].py;
HashList[adr].si=1;
}
else //沖突
{
do{
d=(d+((NameList[i].k))%10+1)%M; //偽散列
sum=sum+1; //查找次數(shù)加1
}while (HashList[d].k!=0);
HashList[d].k=NameList[i].k;
HashList[d].py=NameList[i].py;
HashList[d].si=sum+1;
}
}
}
/*-------------------------------------查找------------------------------------*/
void FindList()
{
printf("\n\n請輸入姓名的拼音: "); //輸入姓名
char name[20]={0};
scanf("%s",name);
int s0=0;
for (int r=0;r20;r++) //求出姓名的拼音所對應(yīng)的整數(shù)(關(guān)鍵字)
s0+=name[r];
int sum=1;
int adr=s0 % M; //使用哈希函數(shù)
int d=adr;
if(HashList[adr].k==s0) //分3種情況進行判斷
printf("\n姓名:%s 關(guān)鍵字:%d 查找長度為: 1",HashList[d].py,s0);
else if (HashList[adr].k==0)
printf("無該記錄!");
else
{
int g=0;
do
{
d=(d+s0%10+1)%M; //偽散列
sum=sum+1;
if (HashList[d].k==0)
{
printf("無記錄! ");
g=1;
}
if (HashList[d].k==s0)
{
printf("\n姓名:%s 關(guān)鍵字:%d 查找長度為:%d",HashList[d].py,s0,sum);
g=1;
}
}while(g==0);
}
}
/*--------------------------------顯示哈希表----------------------------*/
void Display()
{
printf("\n\n地址\t關(guān)鍵字\t\t搜索長度\tH(key)\t\t拼音 \n"); //顯示的格式
for(int i=0; i15; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
printf("按任意鍵繼續(xù)顯示...\n"); //由于數(shù)據(jù)比較多,所以分屏顯示(以便在Win9x/DOS下能看到所有的數(shù)據(jù))
getchar();
for( i=15; i30; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
printf("按任意鍵繼續(xù)顯示...\n");
getchar();
for( i=30; i40; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
printf("按任意鍵繼續(xù)顯示...\n");
getchar();
for( i=40; i50; i++)
{
printf("%d ",i);
printf("\t%d ",HashList[i].k);
printf("\t\t%d ",HashList[i].si);
printf("\t\t%d ",(HashList[i].k)%M);
printf("\t %s ",HashList[i].py);
printf("\n");
}
float average=0;
for (i=0;i NAME_NO;i ++)
average+=HashList[i].si;
average/=NAME_NO;
printf("\n\n平均查找長度:ASL(%d)=%f \n\n",NAME_NO,average);
}
/*--------------------------------主函數(shù)----------------------------*/
void main()
{
/* ::SetConsoleTitle("哈希表操作"); //Windows API函數(shù),設(shè)置控制臺窗口的標題
HANDLE hCon = ::GetStdHandle(STD_OUTPUT_HANDLE); //獲得標準輸出設(shè)備的句柄
::SetConsoleTextAttribute(hCon, 10|0); //設(shè)置文本顏色
*/
printf("\n------------------------哈希表的建立和查找----------------------");
InitNameList();
CreateHashList ();
while(1)
{
printf("\n\n");
printf(" 1. 顯示哈希表\n");
printf(" 2. 查找\n");
printf(" 3. 退出\n");
err:
char ch1=getchar();
if (ch1='1')
Display();
else if (ch1='2')
FindList();
else if (ch1='3')
return;
else
{
printf("\n請輸入正確的選擇!");
goto err;
}
}
}
hashset是--不保證有序,不是 --保證無序。這個是一種巧合,Integer的hashCode()返回的是它本身,數(shù)據(jù)插入的時候,盡管進行了hash混淆,但是還是不行。
本文標題:java哈希排序代碼,java哈希碼值
網(wǎng)頁地址:http://chinadenli.net/article32/dsgchsc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站建設(shè)、定制網(wǎng)站、App設(shè)計、虛擬主機、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)