面试中问道,hashMap是如何实现的,就是说调用它的时候它是如何工作的?

解决方案 »

  1.   

    int uInt = key.getHashCode()&0x8FFFFFF;(具体多少忘记了,总之就是把它弄成正数)
    int index = uInt % map.length;把value放到那个 index位置。下次访问时再通过 key的hashCode() & 0x8FFFFF;再 % map.length;就知道value放在第几个位置了。
    这样map的要得到一个value只跟key运算成index相关,和元素多少相关不大(不大是从理论上说不管多少元素
    反正都是根据key算成index直接去那个位置取的,而不会一个一个查找,但实际是相关的,元素多时产生index聚集的机会就多)如果不同的key得到相同的 index,那么在相同的位置就要保存多个value.
    所以hp内部每个元素实际上先放链表实现的Entity.这样一个位置就可以放多个元素。
      

  2.   

    HashMap中有一个数组,put对象时,根据key对象的hashcode算出数组的下标,存入对象。取对象时,也是一样。
    因为是直接根据对象的hashcode取得对象,不用search的过程,所以效果比较高,但也比较占内存。
      

  3.   

    简单的来说,在根据key找val的时候,不是去简单的依次查找,而是按照事先约定的算法,直接将key计算得到val的
    方法.
      

  4.   

    怎么实现?我不知道用例子来讲合不合适?
    HashMap[] map = new HashMap[2];
    map[0] = new HashMap();
    map[0].put("a", "a");
    map[1] = new HashMap();
    map[1].put("a", "a");
    这是用HapMap的例子,其实说白了就是一对一对的存,这里的一对是一个key值,一个value值,而当你想得到key里值,你可以用get()方法,用上面就是map[0].get("a")就能得"a"
      

  5.   

    学习了!多谢各位!还有就是我想问下,为什么HashMap允许有空的key值,而HashTable确不允许?
      

  6.   

    HashMap 是HashTable的替代体
    HashMap5.0与6.0的实现方式不同.
    6.0是将key=null的元素放在第一个桶位
    5.0我记得是将key=null设为一个常量.
      

  7.   

    HashTable在设计的时候就是不支持key=null的
    [code=Java]
        public synchronized V put(K key, V value) {
    // Make sure the value is not null
    if (value == null) {
        throw new NullPointerException();
    } // Makes sure the key is not already in the hashtable.
    Entry tab[] = table;
    int hash = key.hashCode();//可见,对key=null是不支持的
             //other code
        }
    code]