java中的Hashtable怎么用,请详细举例子说明,拜托了 谢谢就是哈希表,下面这个示例创建了一个数字的哈希表 。它将数字的名称用作键: HashtableString, Integer numbers = new HashtableString, Integer();
numbers.put("one", 1);
numbers.put("two", 2);
numbers.put("three", 3);
要获取一个数字 , 可以使用以下代码:
Integer n = numbers.get("two");
if (n != null) {
System.out.println("two = "n);
}
数据结构与算法-基?。ㄊ耍┕1?/h2>上期使用红黑树实现映射结构,这样的结构满足Key 必须具备可比性,元素有顺序地分布这两个特点 。在实际的应用场景中,存在结构中的元素是不需要有序的,并且 Key 也不具备可比较性,哈希表完全满足这样的应用场景 。
比如设计一个公司的通讯录,存放所有员工的通讯信息,就可以拿手机号作为 index,员工的名称、职位等作为 value 。用哈希表的方式可以将添加、删除和搜索的时间复杂度控制在 O(1) 。
这时创建一个数组,手机号作为 index,然后存放 value 。这样能将复杂度控制在 O(1),但是这种空间换时间的方式也造成了一些其他问题,比如空间复杂度大(需要更多的空间),空间使用率极其低,非常浪费内存空间 。
哈希表就是空间换时间的处理方式,但是做了优化,在空间和时间两个纬度中达到适当的平衡 。
哈希表也叫做散列表 , 整体结构就是一个数组,哈希表会将 key 用哈希函数处理之后返回 hash(哈希值) , hash 就是哈希表中的 index这样的处理方式就可以满足搜索时间是 O(1),这样的处理方式就可以满足搜索时间是 O(1) 。因为哈希表中的 key 可能不具备可比较性,所以要做哈希处理 。
在执行哈希函数之后返回的 hash , 可能会出现相同的情况,这样的情况就是哈希冲突。解决哈希冲突常见的方法有这三种:
JDK1.8 解决哈希冲突的方式就是使用链地址法,其中的链表就是通过链表 红黑树的组合来实现。比如当哈希表中的容量大于等于 64 , 并且单向链表的节点数大于 8 时,转换为红黑树 , 不满足这个条件时就使用单向链表 。
哈希函数是生成哈希值的实现方法 , 哈希函数的实现步骤大致分为两步:
hash_code是生成哈希值的函数,也可以直接用 JAVA 中的标准函数hashCode()。
这里可以用位运算替换%运算,来提高效率 。因为位运算是二进制运算,所以在设计数组的时候,需要将数组的长度设计为 2 的幂次方 。
一个良好的哈希函数,可以让生成的哈希值分布更加均匀,减少哈希冲突的次数,最终可以提升哈希表的性能 。
Key 的常见类型可能有证书、浮点数、字符串或者自定义对象,不同的类型生成哈希值的方式也会不一样,但是目标是一致的,就是尽量让每个 Key 的哈希值唯一 , 尽量让 Key 中的所有信息参与运算。
比如在 Java 中,Long的哈希值实现如下代码:
这里的和^就是将高 32 bit 和低 32 bit 混合计算出 32 bit 的哈希值 。
在计算字符串的哈希值时,可以将字符串拆解成若干个字符,比如 jack,将它拆解成 j、a、c、k(字符的本质就是一个整数,所以 jack 的哈希值可以表示为 j * n3a * n2c * n1k * n0,表达式也可以写成 [(j * na) * nc] * nk,代码实现如下:
看上面代码时,可以发现,表达式中的n使用的是 31 这个数字 , 那么为什么用 31 呢?
因为 31 不仅符合 22 - 1 , 而且它还是个奇素数(既是技术,又是素数,还是质数),素数和其他数相乘的结果比其他方式更容易产生唯一性,减少哈希冲突 。
JDK 中,乘数 n 也是用 31,31 也是经过观测分布结果后的选择,关于 31 的变体可以有以下几种:
31 * i = (25 - 1) * i = i * 25 - i = (i5) - i
JAVA创建一个哈希表储存数据并输出,要完整代码我就不写了,给个提示吧:
建一个类,名字就叫员工,它有三个属性 , 分别是你要的三个数据,名字、工龄、工号 。然后 , 每次put的时候这样:put('1234',员工1);以员工工号为key , 类员工为value
用java编写哈希表 , 输入一组数据,创建一个哈希表,然后进行元素的查询、删除#包括中
#包括中
#包括
/ /#包括
#定义50 HASH_LEN / /哈希表的长度
#定义男47
#定义NAME_NO 30 / /数字名称
typedef结构名称
{
的char * PY; / /名称的字母
K; / /拼音对应的整数
}名称;
名称名单[HASH_LEN];
typedef的struct hterm的/ /哈希表
{ ,
炭* PY / /名称的字母
K; / /拼音对应的整数
诠释SI / /查找长度
} HASH; BR / HASH HashList的[HASH_LEN];
/ * -----------------------名称(结构数组)来初始化 - -------------------------------- * /
的无效InitNameList()
{
名单[0] 。PY =的“chenghongxiu”;
名单[1] 。PY =“元昊”;
名单[2] 。PY =“襄阳”;
名单[3] 。PY =的“zhanghen”;
名单[4] 。PY =的“chenghongxiu”;
名单[5] 。PY =“杨小凯”;的
名单[6] 。PY =“六朋”;
名单[7] 。PY =的“shenyonghai”;
名单[8] 。PY =“chengdaoquan”名单[9] 。PY =的“ludaoqing”;
名单[10] 。PY =的“gongyunxiang”;
名单[11] 。PY =的“sunzhenxing”;
名单[12] 。PY =的“sunrongfei”;
名单[13] 。PY =的“sunminglong”;
名单[14] 。PY =“张皓”;
名单[15] 。PY =“田苗”;
名单[16] 。PY =的“yaojianzhong”;
名单[17] 。PY =的“yaojianqing”;
名单[18] 。PY =的“yaojianhua”;
名单[19] 。PY =的“yaohaifeng”;
名单[20] 。PY =的“chengyanhao”;
名单[21] 。PY =的“yaoqiufeng”;
名单[22] 。PY =的“qianpengcheng”;
名单[23] 。PY =的“yaohaifeng”;
名单[24] 。PY =的“bianyan”;
名单[25] 。PY =“linglei”;
名单[26] 。PY =的“fuzhonghui”;
名单[27] 。PY =的“huanhaiyan”;
名单[28] 。PY =的“liudianqin”;
名单[29] 。PY =的“wangbinnian”
字符* F;
INT R,S0;
(INT I = 0; NAME_NO;)
{
S0 = 0;
F =名单[I] 。PY
相关(r = 0; *(FR)= NULL与r)/ /方法:每个字符的字符串对应的ASCII码的总和,所得到的整数作为哈希表的关键字
S0 =(FR)S0;
名单[I] 。K = S0;
}
}
/ * -----------------------建立哈希表--------------------------------- * /
的无效CreateHashList()
{(INT I = 0; NAME_NO;)
{
HashList [I] 。PY =“”;
HashList [I] 。K = 0;
HashList [I] 。SI = 0;
}
(I = 0; NAME_NO)
{
总和= 0;
ADR =(名单[I] K)%M / /哈希函数
- = ADR;
(HashList [ADR] SI == 0)/ /如果没有冲突
{ HashList [ADR] 。K =的名单[I] 。K; ,
HashList [ADR] 。PY =的名单[I] 。PY; ,
HashList [ADR] 。SI = 1;
} 其他/ /冲突
{
{
D =(D((名单[I] K))%101)%M / /伪哈希总和=总和 1 / /发现号加1
}(HashList [D] K!= 0);
BR / HashList的研究[D] 。K =的名单[I] 。K;
HashList的研究[D] 。PY =的名单[I] 。PY;
HashList的研究[D] 。SI =总和 1;
}
}
}
/ * ------------------- ------------------查找------------------------------- ----- * /
的无效FindList()
{
的printf(“\ n \ n已请输入名字的拼音:”); / /输入名称
【java哈希表常用代码 java 哈希函数】 字符名[20] = {0};
scanf函数(“%”,名称)
INT S0 = 0;
(R = 0; 20,R)/ /找到对应的字母的名称一个整数(关键字)
S0=名称[R] 。
总和= 1; BR / ADR = S0%M , / /使用哈希函数
= ADR;
如果判断(HashList [ADR] 。K == S0)/ /三例
的printf(“\ N名:%s关键字:%d个查找长度:1” , HashList [J] 。PY,S0);
否则 , 如果(HashList [ADR] 。K == 0)
的printf(“有没有这样的记录!”); 其他
{
G = 0;
{
D =(DS0%101)%M; / /伪散货的列
总和=总和 1;
(HashList的研究[D] 。K == 0)
{
的printf(“无记录!”); br / G = 1;
}
(HashList并[d],K = S0)
{
的printf(“\ N名:%s关键字:%d个查找长度为:%d的”HashList [J] 。PY,S0,总和);
G = 1;
}
} , (G == 0);
}
}
/ * -------------------- ------------展览哈萨克斯坦希腊表---------------------------- * /
无效显示()
{
的printf(“\ n \ n已地址\吨关键字\ T \ T查找长度\ TH(键)\ T \吨拼音\ N”); / /显示格式 BR p(INT I = 0; 15;)
{
的printf(“%d的”,I);
的printf(“\吨%D“HashList [I] K);
的printf(”\ T \ T%D“,HashList [I] SI);
的printf(”\ T \ T%D“ (HashList [I] K)%M);
的printf(“\%”,HashList的[] 。PY);
的printf(“\ N”);
}
的printf(“按任意键继续显示... \ N”); / /由于数据较多,所以分屏显示(Win9x/DOS仍然可以看到所有的数据)
用getchar();
(I = 15; 30; 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(”\%“,HashList的[I] 。PY);
的printf(”\ N“)
}
的printf(“按任意键继续呈现... \ N”);
的getchar的();
(I = 30; I 40)
{
的printf(“%d的” , 我);
的printf(“\吨为%d” , HashList [I],K); /的printf(“\ T \ T%D” , HashList [I] SI);
的printf(“\ T \ T%D”(HashList [I] K)%M); /的printf(“\%”,HashList [I] PY);
的printf(“\”);
}
的printf(“按任意键继续呈现... \ N“);
的getchar的();
(I = 40; 50;)
{
的printf(”为%d“,I);
的printf(”\吨为%d“ , HashList [I] K)
的printf(”\ T \ T%D“,HashList [I] SI) ;
的printf(“\吨\ T为%d”,(HashList [I] , K)%M);
的printf(“\%”,HashList的[] 。PY); BR /的printf(“\ N”);
}
浮法平均= 0;
(= 0; NAME_NO;)BR /平均= HashList [I] 。SI;
/ = NAME_NO;
的printf(“\ N \ N平均查找长度:ASL(%D)=%f \ N \ N”,NAME_NO平均);
}
/ * --------------------------------主要功能------ ---------------------- * /
无效的主要()
{
/ * :: SetConsoleTitle(“哈希表操作“)/ / Windows API函数 , 设置控制台窗口标题
手柄HCON = :: GetStdHandle(STD_OUTPUT_HANDLE); / /得到标准输出设备处理
:: SetConsoleTextAttribute(HCON,10 | 0 )/ /设置文本颜色
* /
的printf(“\ N ------------------------哈希表的创建查找----------------------“);
InitNameList();
CreateHashList();
(1)
{
的printf(“\ N \ N”);
的printf(“1 。显示哈希表\”);
printf(“请2查找\ N“);
的printf(”3 。退出\ n“);
错误:
字符CH1 =的getchar的();
(CH1 = '1')
显示();
其他(CH1 = '2')
FindList();
其他(CH1 = '3')返回;
其他
{
的printf(“\ n请输入正确的选择!”);
转到犯错;
}
} }
关于java哈希表常用代码和java 哈希函数的介绍到此就结束了 , 不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- c语言中选择结构形式有哪些,c语言选择结构的作用
- 鸿蒙系统开机介绍,鸿蒙开机图片壁纸
- 固态硬盘m.2怎么外接,m2固态怎么外接电脑usb
- oracle怎么改 oracle怎么改字体大小
- jquery分页下拉框筛选,jquery 分页
- 如何规划电商,如何规划电商创业800字
- 初学者理发教程直播男生,理发教学视频基本手法男
- js怎么传递数据给PHP js怎么传递参数
- 视频为什么不能推荐了,为什么有些视频不能在抖音上推荐