HashMap和Hashtable的区别

一、Map集合

1.HashMap集合的数据结构和特性

1.HashMap集合的存储

​ HashMap是Map接口的子接口它是一个双列集合只针对键不针对值,它通过键来映射值得内存地址,其底层通过hashcode和equals方法保证了键的唯一性。

​ 如果键存储的是自定义的对象,那么自定义的对象要重写hashCode方法和equals方法。

他在jdk1.8之前是用的数组加链表的结构在jdk8之后用的是数组加链表加红黑树,当一个数组上的索引上挂载的链表长度大于8时,链表就会扩容成红黑树。

HashMap和Hashtable的区别

2.HashMap集合的特性及应用场景

1.HashMap是线程不安全的
2.HashMap主要应用于统计商品的数量,键为商品类型,值为int类型,遍历商品的数组或单例集合,判断Map<商品,计数>,如果Map集合中包含这个商品的键,那么就从map中取出键为商品的值然后在计数上+1,再存储进集合中
public class HashMapUse {
    public static void main(String[] args) {
        //三个手机对象
        Phone phone = new Phone("华为P30", 3000.00, "华为");
        Phone phone1 = new Phone("OPPE", 3200.00, "OPPO");
        Phone phone2 = new Phone("小米", 3000.00, "小米");
        Phone phone3 = new Phone("华为P30", 3000.00, "华为");
        Phone[] phones =new Phone[4];
        phones[0]=phone;
        phones[1]=phone1;
        phones[2]=phone2;
        phones[3]=phone3;
        //创建一个统计map集合
        HashMap<Phone, Integer> map = new HashMap<>();
        //遍历这个手机集合
        for (Phone p:phones
             ) {
            if(!map.containsKey(p)){
                //map集合中不包含手机说明第一次出现
                map.put(p,1);
            }else {
                //map中包含手机说明是第二次出现
                map.put(p,map.get(p)+1);
            }
        }
        System.out.println(map);
        //打印的结果可以看出华为p30出现了两次
        //{Phone(name=华为P30, price=3000.0, manufacturer=华为)=2,
        // Phone(name=OPPE, price=3200.0, manufacturer=OPPO)=1,
        // Phone(name=小米, price=3000.0, manufacturer=小米)=1}
    }
}

2.HashMap和HashTable集合的区别

1.相同点

1.HashMap和Hashtable都是双例集合

2.不同点

1.HashMap允许存储null键和null值

2.HashMap是线程不安全的

3.Hashtable不允许存储null键和null值

4.Hashtable是线程不安全的

5.如果要使线程安全也不应该使用Hashtable因为Hashtable的效率比较低,建议使用HashMap的给力子类ConcurrentHashMap

上一篇:Java流操作常用函数总结(持续更新中)


下一篇:C# 拓展方法( 二)——模拟拓展方法的场景