Hashtable和HashMap

昨天做牛客网还遇到了一个问题:Hashtable和HashMap。我当时看到这两个东西,脑袋冒出一句话:这啥勒?(此处省略一万字)于是乎,就去菜鸟教程了解了一下。

Hashtable

Hashtable是什么?

它是一种存储键值对的散列表。

来说说它的几个特点:

  1. 继承自Dictionary类,Dictionary类是一个抽象类。而且,现在已经不常用了,几乎都用Map类。
  2. 存储的是单链表,不信的话,我后面可以证明给你看。
  3. 排序是乱序,无论你放进去的键值对是按照怎样的顺序,输出的结果都是乱序的。

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接口。如下:

image

HashMap的定义

HashMap的定义和Hashtable一样,有两种方法:

//1
HashMap<键类型,值类型> 变量名 = new HashMap<>();
//注意:右边不需要写键值类型!(可写可不写)
//2
HashMap 变量名 = new HashMap();
//没有定类型的散列表,添加的键的类型可以不一样,值的类型也可以不一样!

HashMap的方法

HashMap内含有的方法和Hashtable差不多,用法也差不多,就是有一定优化。

HashMap内含有的比较常用的方法如下:

image

其中值得注意的是:

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:以上内容仅为个人学习后的心得,如有疑问请联系我!感谢!

posted @ 2021-08-28 21:30  Cara_Smith  阅读(46)  评论(0编辑  收藏  举报