HashMap与HashTable~

这一块主要整理一下HashMap与HashTable之间个别重要的点和细节以及这两者之间的异同点!

首先简单介绍一下何谓线程安全?

如果我们的代码所在的进程中有多个线程在同时运行,而且这些线程可能同时运行这段代码。如果每次的运行结果和单线程的运行结果是一样的,而且其他的变量的值也和预期的是一样的,那就是线程安全的。

一、HashMap

1、HashMap线程不安全体现在哪里?

HashMap的默认容量是16,当在进行put的时候,插入的元素超过了容量(由加载因子决定)的范围就会触发扩容操作,也就是rehash过程,这个方法会重新将原数组的内容重新hash到新的扩容数组当中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现在同一数组下用链表表示,造成闭环,导致在获取数据也就是进行get操作的时候,产生死循环,所以HashMap是线程不安全的。(本来应该画图解释的,但是限于自身对这个多线程环境操作不太熟悉,也就直接给出文字总结版)。

2、HashMap的适用场景?

因为HashMap是非线程安全的,故其适用于单线程环境下。

底下的代码演示是上课没写出来,课下自己又练了练,贴在这里。

//10万个数据统计数据重复出现的次数并打印
        //首先随机产生10万个原始数据
        LinkedList list=new LinkedList();
        Random random=new Random();
        for(int i=0;i<100000;i++){
            list.add(random.nextInt(100));
        }
        //统计出现的次数
        HashMap<Integer,Integer> map=new HashMap<>();
        Iterator<Integer> iterator=list.iterator();
        while(iterator.hasNext()){
            Integer value=iterator.next();
            Integer num=map.get(value);
            if(num==null){
                map.put(value,1);
            }else{
                map.put(value,num+1);
            }
        }
        //打印数据
        System.out.println("统计10万个数据重复出现的次数:");
        Iterator<Map.Entry<Integer,Integer>> iterator1=map.entrySet().iterator();
        while(iterator1.hasNext()){
           Map.Entry<Integer,Integer> entry=iterator1.next();
           Integer value1=entry.getKey();
           Integer number=entry.getValue();
           System.out.print(number+"  "+value1 +"      ");
        }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值