ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

HashMap和Hashtable的区别

2021-09-22 16:02:37  阅读:175  来源: 互联网

标签:map HashMap 区别 phones Phone Hashtable 集合


一、Map集合

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

1.HashMap集合的存储

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

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

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

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

标签:map,HashMap,区别,phones,Phone,Hashtable,集合
来源: https://www.cnblogs.com/gaozaohui/p/15320251.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有