java 的HashMap是Map接口的一个实现,采用的是key-value键值存储,其中key是不能重复的,对于重复的key,将覆盖其value。同时HashMap的线程不安全的。

今天写了这样一个多线程代码,发现一个问题不理解,希望通过博客园的高手给予解答。

package com.mesnac.qc.A1;import java.util.HashMap;
import java.util.Hashtable;public class Foo {private int x = 100;private HashMap hMap = new HashMap();private Hashtable hTab = new Hashtable();public int getX(){return x;}public HashMap getHMap(){return hMap;}public Hashtable getHTab(){return hTab;}public Hashtable htb(Object key,Object value){hTab.put(key, value);return hTab;}public HashMap hfx(Object key,Object value){hMap.put(key, value);return hMap;}public int fix(int y){synchronized(this){x = x - y;}return x;}
}

package com.mesnac.qc.A1;import java.util.HashMap;
import java.util.Hashtable;public class MyRunable implements Runnable{private Foo a1 = new Foo();public void run(){for(int i = 0;i < 3; i++){a1.fix(20);a1.hfx(Integer.valueOf(i), Integer.valueOf(i));a1.htb(Integer.valueOf(i), Integer.valueOf(i));try {Thread.sleep(1);} catch (Exception e) {// TODO: handle exception
            }System.out.println(Thread.currentThread().getName()+"当前Foo值"+a1.getX());System.out.println(Thread.currentThread().getName()+"当前HMAP值"+a1.getHMap());System.out.println(Thread.currentThread().getName()+"当前HTable值"+a1.getHTab());}}public static void main(String args[]){MyRunable aMyRunable = new MyRunable();Thread a = new Thread(aMyRunable,"Thread-A");Thread bThread = new Thread(aMyRunable,"Thread-B");a.start();bThread.start();HashMap t1 = new HashMap();t1.put(Integer.valueOf(0), Integer.valueOf(0));t1.put(Integer.valueOf(0), Integer.valueOf(0));t1.put(Integer.valueOf(0), Integer.valueOf(0));t1.put(Integer.valueOf(0), Integer.valueOf(0));Hashtable t2 = new Hashtable();t2.put(Integer.valueOf(0), Integer.valueOf(0));t2.put(Integer.valueOf(0), Integer.valueOf(0));t2.put(Integer.valueOf(0), Integer.valueOf(0));t2.put(Integer.valueOf(0), Integer.valueOf(0));t2.put(Integer.valueOf(0), Integer.valueOf(1));System.out.println(t1);System.out.println(t2);}}

主要是两个线程去操作HashMap。我知道线程不安全,但是多次运行这个程序。会发现HashMap中存在 {2=2,1=1,0=0,0=0}的情况,查阅JDK,发现HashMap的存储是根据key获得一个hash值,然后执行key1==null?key2==null:key1.equal(key2)的算法,不理解为什么会产生重复的值。难道是因为第一个0,0存入的时候,执行到hash算法之后,但是没保存,第二个线程也执行到判断,这样两个都保存进去了么?

希望博客园大牛给予解答。。。

转载于:https://www.cnblogs.com/snail-tomorrow/archive/2012/07/04/2575731.html

java HashMap问题相关推荐

  1. LeetCode(13.罗马数字转整数) JAVA Hashmap

    LeetCode(13.罗马数字转整数) JAVA Hashmap 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D ...

  2. java HashMap的使用

    java HashMap的使用 import java.util.HashMap; import java.util.Iterator; public class WpsklHashMap { pub ...

  3. Java HashMap工作原理深入探讨

    大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道 HashMap内部如何工作呢?几天前,我阅读了java.util.H ...

  4. Java HashMap的死循环的启示

    在酷壳上看到博主陈皓写的最新文章疫苗:Java HashMap的死循环.博主看问题非常透彻,代码分析到位,而且图文并茂,很容易让人理解一个死循环是怎么产生的. 在博文中,耗子叔叔分析的最重要的一点就是 ...

  5. java hashmap 去重复_为什么我在Java HashMap中得到重复的键?

    本问题已经有最佳答案,请猛点这里访问. 我似乎在标准Java HashMap中得到重复的键."重复"是指键的equals()方法相等.这是有问题的代码: import java.u ...

  6. java散列法的运用实例,Java HashMap compute() 使用方法及示例

    Java HashMap compute() 使用方法及示例 Java HashMap compute()方法计算一个新值,并将其与哈希映射中的指定键相关联. compute()方法的语法为: has ...

  7. Java HashMap 遍历方式性能探讨

    转载自 Java HashMap 遍历方式性能探讨 关于HashMap的实现这里就不展开了,具体可以参考JDK7与JDK8中HashMap的实现 JDK8之前,可以使用keySet或者entrySet ...

  8. java hashmap实例_java HashMap详解及实例代码

    java hashmap /* * map集合的特点 * 将键映射值的对象,一个映射不能包含重复的值:每个键最多只能映射到一个值 * * map集合和collection集合的区别? * map集合存 ...

  9. Java HashMap与Hashtable数据结构和特点+HashSet简述

    Java HashMap与Hashtable数据结构和特点+HashSet简述 1.HashMap HashMap就是基于数组和链表的数据结构:JDK1.7使用 数组+单向链表:JDK1.8使用 数组 ...

  10. Java HashMap的工作原理 及各种Map区别

    2019独角兽企业重金招聘Python工程师标准>>> 一.Java HashMap的工作原理 jdk1.7下HashMap数据结构:数组加链表,链表长度没有8的限制: jdk1.8 ...

最新文章

  1. 用ajax进行部门的验证,ajax用$.post方式进行用户名校验
  2. 基于复杂方案OWSAP CsrfGuard的CSRF安全解决方案(适配nginx + DWR)
  3. 各省市数据中心机房工程新建项目汇总(2021年)
  4. windows下cmake编译VTK到PCL中
  5. Tomcat的类加载器
  6. Qt-Threads和QObjects详解
  7. C语言学习笔记--函数与指针
  8. Ceph保证数据安全的机制
  9. yii ajax验证失败返回提示,Yii ajax显示错误提示,messagebox
  10. HBase EndPoint加载失败
  11. TreeMap按照key排序
  12. 《初级会计电算化实用教程(金蝶KIS专业版)》一导读
  13. 苹果出现长方形透明框_看到我卧槽!这是苹果史上最疯狂的开发者大会
  14. 超市扫码机器服务器系统搭建,超市用的扫码机是怎么个原理?
  15. Vue的倒计时插件(vue-flip-down)
  16. 计算机应用软件弹窗消除,去除电脑弹窗广告的4种方法
  17. java处理图片的所有类_Java的图片处理工具类
  18. 微商加粉方法,微商加粉,究竟难在哪?
  19. 微信小程序二手汽车拍卖系统丨可以android studio运行
  20. 三星为企业服务器开发高性能PCIe 5.0固态硬盘;阳狮集团升任张珲杰为明思力中国董事总经理 | 全球TMT...

热门文章

  1. android ndk x86 arm,How to use SIGRTMIN in x86 or armeabi-v7a abi in Android NDK?
  2. vue 二维数组_最近研究Vue源码时我发现的一些好玩函数
  3. es6 混合commjs_es6的模块化文件mjs为什么无法运行呢 | 学步园
  4. 新认知,新力量!神策 2021 数据驱动大会来了
  5. 神策数据斩获三殊荣,美通社小饭桌正和岛齐认可
  6. “策小编数洞”开工啦,欢迎来唠两块钱儿的
  7. TPYBoard:一款可以发挥无限创意的MicroPython开发板
  8. Shell之awk常用用法
  9. 使用PVRTexTool压缩纹理的基本用法
  10. 5G有多恐怖?几秒钟可下载整部电影