int[] a = new int[100], 不就是在堆里分配了一个对象,通过a可以找到这个对象,关hashcode什么事?hashcode怎么起作用的?

解决方案 »

  1.   

    hashCode() 用于判断两个变量是不是同一个对象。通常用不到。参考:http://blog.csdn.net/richardsundusky/article/details/1508028
      

  2.   

    hashcode 在 hashtable、hashmap这种基于hash值的容器中用到,用来在不同的桶中存放对象
      

  3.   

    看HashMap源码就知道hashCode的作用了
      

  4.   


    那么int[] a =new int[100],这个过程没有hashcode吗
      

  5.   

    这个显然没有用到hashcode
    hashcode是用一种算式来得到的值,一个实例对应一个值,多个实例对应的多个hashcode值要求分散,这样才叫hashcode散列
    然后再根据hashcode到hashtable,hashmap里面找存值的位置,hashcode分散的情况才不会让这些值重叠到一起影响效率。
      

  6.   

    我就是想知道hashcode大概怎么起作用的?比如int【】 a = new int[100],如果这个过程hashcode起作用的话?我想知道hashcode大概的原理?
      

  7.   

    我认为int[] a = new int[100]完全没有用到hashcode
    数组应该是会在堆里面分配一段连续内存来存放的,所以new int[100]就是分配100个连续的int大小(假设是2个字节)的内存来存放,就是200个字节存放数组,通过指针的移动来读取写入数组第i个的值,与hashcode是完全无关的
    hashcode是一种散列的算法,我觉得hashcode的目的就是为了让一组集中的数值变得分散,
    比如说int[] a = {1,2,3,...,100},设定hashcode的算式为,a[i]*a[i]*a[i] mod 1000,这样就把原来的在1到100里面分布的100个值,变成了1到1000里面分布的100值,而且分布的比较分散,没有堆在一起。这样值不是分散了么,于是hash散列就形成了
      

  8.   

    接9L
    接下来我觉得lz的疑惑是散列在编程中有什么用处
    我们往一个hashmap或者hashtable或者hashset里面插值,根据的就是hashcode的值,
    我们建一个1000位长度hashset,要在里面插入int[] a = {1,2,3,...,100},
    怎么插呢,就是根据hashcode来插,我们这里设定的hashcode算式是a[i]*a[i]*a[i] mod 1000
    那么1对应的hashcode是1,10对应的hashcode是0,40对应的hashcode为64,80对应的hashcode是512,
    于是我们把1插在hashset的第一位,10插在第0位,40插在第64为,80插在512位
    有什么好处呢,我们在插入的值和插入的位置里面有了一定的联系了
    当我们要删除值为40的数该怎么做呢,就是算40的hashcode64,找到64位,比较一下第64为的数是不是40,如果是,直接删了就好了,我们就省去了遍历这个set的复杂过程,降低了时间复杂度了
      

  9.   

    接10L
    如果碰到10和100,它们的hashcode都是0,那么都要把它们插到第0位,但是第0位又不可能插2个数,肿么办?
    我们先插10,这时第0位是空的,10被成功的插入了第0位,等我们插100的时候,也是算出hashcode为0,我们尝试插第0位,发觉第0位被占,于是我们后移1位,尝试插第1位,发觉第1位被数组1占了,那就在后移1位,插第2位,发现是空的,可以插入,那就插吧。
    所以我们要搜索or删除值100的时候,其实是从第0位查起,判断出第0位不是100,于是我们继续查第1位,一直查到第2位,找到100把它删了
    这里就涉及到一个效率问题了,如果总是插好几次才插进去,删好几次才找到值把它删了,这就影响效率了,所以hashcode要设得分散,平均,这样效率才能高,我这个hashcode也不是很分散,而且有些位置的值根本取不到
    hashcode最大的特点就是在值和位置上有了联系,给出了一种根据值来搜索的方法,效率大大提高