Hash表也称为散列表;在计算机上要找到同一个散列值的不同输入是不可能的,那么当HashMap输入相同key值的时候,就没必要将value值存贮到链表上了,直接替换原来的value值不是更好吗?效率是不是也提高了呢?这个问题一直困扰这我,期待大牛们解答……HashMap链表HASH

解决方案 »

  1.   

    key相同本来就是替换的。等等,“在计算机上要找到同一个散列值的不同输入是不可能的”,谁教你的,以后别跟他玩了
      

  2.   

    百度百科说的啊?难道我要抛弃百度了?http://baike.baidu.com/view/273836.htm?fromId=1041476
      

  3.   


    public class Bean {
     public int hashCode() {
      return 47;
     }
    }
      

  4.   

    数组不必多言。至于为何用链表,我想问:大哥,凭什么替换啊?!
    假设你原本想
    {
    "KEY": "VALUE", // Hash对应的存储位置
    "A": "123", // 0
    "B": "456", // 1
    "C": "555", // 4
    "D": "666", // 3
    "E": "777", // 2
    "X": "XYZ" // 0
    }那么,显然,你不希望让Key="X"的Entry冲掉Key="A"的,而是希望他们和平共处吧。所以,对于hash后算出的存储位置,通过链表的方式避免错误。
      

  5.   


    虽然根据哈希算法的不同,很有可能不会造成冲突,但是反过来讲,这样的数据结构也会造成巨大的内存浪费。
    因此有限量的Hash表内存结构还是有必要的,在这种状态下,冲突的可能性会大大提高。另外,就和楼上说的一样,完全没冲突的Hash算法,这个在数学上貌似还没严格证明吧,呵呵。
      

  6.   

    你的意思是通过Hash算法算出的哈希值可能相同,因此在数组存储位置上创建一个链表来存储相同哈希值的数据,是这样的吗?
      

  7.   

    你的意思是通过Hash算法算出的哈希值可能相同,因此在数组存储位置上创建一个链表来存储相同哈希值的数据,是这样的吗?
    对,但不一定是hash值一样。重点是通过hash算出的存储位置。假设你数组只有50个位置。可能hash = 1 和 hash = 1234567算出来的位置也是一样的。当然,两个hash一样的key,位置更是一样。
      

  8.   

    当key 相等 或 equals 的时候本来就是覆盖啊,关键是根据key算出来的hashcode计算数组下标位置, 多个key的hashcode相同的时候会以链表的形式存储。数组内放的是链表的头节点。建议看看源代码吧
    数组查找遍历快,链表删除,插入快,结合了这两者的有点