Hashtable和HashMap
昨天做牛客网还遇到了一个问题:Hashtable和HashMap。我当时看到这两个东西,脑袋冒出一句话:这啥勒?(此处省略一万字)于是乎,就去菜鸟教程了解了一下。
目录
Hashtable
Hashtable是什么?
它是一种存储键值对的散列表。
来说说它的几个特点:
- 继承自Dictionary类,Dictionary类是一个抽象类。而且,现在已经不常用了,几乎都用Map类。
- 存储的是单链表,不信的话,我后面可以证明给你看。
- 排序是乱序,无论你放进去的键值对是按照怎样的顺序,输出的结果都是乱序的。
Hashtable定义的两种方法:
//1.
Hashtable<键类型,值类型> 变量名 = new Hashtable<>();
//注意:右边不需要写键值类型!
//2
Hashtable 变量名 = new Hashtable();
//没有定类型的散列表,添加的键的类型可以不一样,值的类型也可以不一样!
来谈谈它的几个常用方法
- put(key,value):将指定键映射到此哈希表中的指定值。注意,用put方法放入同一个键两个值时,默认为后一个值,原因是Hashtable是单链表,只能指向一个值!
- clear():清除哈希表中所有键值对
- remove(key):清除对应键/键值的键值对
- contains(value):判断哈希表中是否含有此值的键的对应关系,返回值为布尔值
- size:哈希表中的键的个数,即:此哈希表中的键值对的个数。
- get():获取对应键的值。
- elements():枚举哈希表对应的值。elements()是非静态方法,只能类对象访问。具体格式见下例:
for(Enumeration en = 哈希表变量.elements();en.hasMoreElements();){
System.out.println(en.nextElement());
}
代码示例
package com.gy.practice;
import java.util.Enumeration;
import java.util.Hashtable;
/*HashTable 键值对
1.继承自Dictionary抽象类
2.当使用哈希表时,要指定一个键的对象,和要链接到该键的值。
3.支持同步
4.Dictionary抽象类目前已过时,都采用的Map接口。
*/
public class HashTable {
public static void main(String[] args) {
Hashtable hash = new Hashtable();//定义哈希表
hash.put("a",1);//将a映射到哈希表的1中
hash.put("b",2);
hash.put("c",3);
hash.put("d",4);
System.out.println(hash.size());//4 哈希表的长度
System.out.println(hash.get("b"));//获取键为b的值
System.out.println(hash.contains(3));//true 判断哈希表中是否含有此值的键的对应关系
hash.remove("a");//移除键为a的键值对
hash.clear();//清除所有键值对
//枚举哈希表对应的值
for(Enumeration en = hash.elements();en.hasMoreElements();){
System.out.println(en.nextElement());
}
}
}
HashMap
什么是HashMap?
HashMap和Hashtable一样,都是散列表,存储键值对;插入时无序。
HashMap继承自 AbstractMap,实现了Map,Cloneable, Serializable接口。如下:
HashMap的定义
HashMap的定义和Hashtable一样,有两种方法:
//1
HashMap<键类型,值类型> 变量名 = new HashMap<>();
//注意:右边不需要写键值类型!(可写可不写)
//2
HashMap 变量名 = new HashMap();
//没有定类型的散列表,添加的键的类型可以不一样,值的类型也可以不一样!
HashMap的方法
HashMap内含有的方法和Hashtable差不多,用法也差不多,就是有一定优化。
HashMap内含有的比较常用的方法如下:
其中值得注意的是:
isEmpty()是用来判断散列表是否为空的方法;
keySet()是用来获取所有的键的方法;
values()是用来获取所有的值的方法;
replace(K,V)替换对应键的值;
entrySet()返回 hashMap 中所有映射项的集合视图。
代码示例
下面示例一下上述方法的使用:
package com.gy.practice;
import java.util.HashMap;
//HashMap
public class Hash_Map {
public static void main(String[] args) {
//创建一个HashMap对象
HashMap<String,String> map = new HashMap();
//向里面添加键值对
map.put("1","google");
map.put("2","taobao");
map.put("3","jingdong");
map.put("4","microsoft");
//isEmpty:判断散列表是否为空
System.out.println(map.isEmpty());//false
System.out.println("---------------------------");
//keySet 迭代(也就是遍历)散列表中的每一个键
for (String i : map.keySet()) {
System.out.print(i+" ");//1 2 3 4
}
System.out.println();
System.out.println("---------------------------");
//values 迭代(也就是遍历)散列表中的每一个值
for(String value : map.values()){
System.out.print(value+" ");//google taobao jingdong microsoft
}
System.out.println();
System.out.println("----------------------------");
//replace(K,V):只能替换对应键的值,不能替换对应值的键!
map.replace("1","soft");
System.out.println(map);//{1=soft, 2=taobao, 3=jingdong, 4=microsoft}
System.out.println("-----------------------------------");
System.out.println(map.entrySet());//[1=soft, 2=taobao, 3=jingdong, 4=microsoft]
}
}
细心的伙伴可能注意到了输出map和输出map.entrySet()的结果是一样的了。但是要注意:直接输出map,得到的结果是一个字典格式{};而输出map.entrySet()时得到的是数组格式[]。
Hashtable 和 HashMap的同异
- Hashtable可以实现同步,而HashMap不可以同步
- 前者继承自Dictionary抽象类,后者继承自抽象类AbstractMap抽象类
- 前者的方法没有后者多
但是:
- 前者和后者都是单链表
- 前者和后者都是乱序插入
- 前者和后者某些方法是一致的,使用方法也是一致的。后者是前者的扩展。
Pass:以上内容仅为个人学习后的心得,如有疑问请联系我!感谢!
加油!努力!千万不要放弃!