706. 设计哈希映射

链地址法

package aday;

import java.util.Iterator;
import java.util.LinkedList;

public class MyHashMap {
        private class Pair{
                private int key;
                private int value;

                private Pair(int key, int value) {
                        this.key = key;
                        this.value = value;
                }

                public int getValue() {
                        return value;
                }

                public void setValue(int value) {
                        this.value = value;
                }

                public int getKey() {
                        return key;
                }

                public void setKey(int key) {
                        this.key = key;
                }
        }
        private static final int BASE=769;
        LinkedList[] data;

        /** Initialize your data structure here. */
        public MyHashMap() {
                data=new LinkedList[BASE];
                for (int i = 0; i < data.length; i++) {
                        data[i]=new LinkedList<Pair>();
                }
        }
        private static int hash(int key){
                return key%BASE;
        }
        /** value will always be non-negative. */
        public void put(int key, int value) {
            int h=hash(key);
                Iterator<Pair> iterator=data[h].iterator();
                while (iterator.hasNext()){
                        Pair pair = iterator.next();
                        if (pair.getKey()==key){
                                pair.setValue(value);
                                return;
                        }
                }
                data[h].offerLast(new Pair(key, value));

        }

        /** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */
        public int get(int key) {
                int h=hash(key);
                Iterator<Pair> iterator=data[h].iterator();
                while (iterator.hasNext()){
                        Pair pair = iterator.next();
                        if (pair.getKey()==key){
                                return pair.getValue();
                        }
                }
                return -1;

        }

        /** Removes the mapping of the specified value key if this map contains a mapping for the key */
        public void remove(int key) {
                int h=hash(key);
                Iterator<Pair> iterator = data[h].iterator();
                while (iterator.hasNext()){
                        Pair pair = iterator.next();
                        if (pair.getKey()==key){
                                data[h].remove(pair);
                                return;
                        }
                }
        }
}

**Java Iterator

(**迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代ArrayList和HashSet 等集合。

迭代器 it 的两个基本操作是 next 、hasNext 和 remove。

调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。

调用 it.hasNext() 用于检测集合中是否还有元素。

调用 it.remove() 将迭代器返回的元素删除。

解析

private static final int BASE=769;
private static int hash(int key){
return key%BASE;
}

质数取模,其实是利用了同余的概念:当元素是个有规律的等差数列时,并且和基数(数组大小)最大公约数不为1时,就会造成哈希映射时冲突变高(数组某些位置永远不会有值)。比如数列0,6,12,18,24,30…,

base为10,取模(0,6,2,8,4,0…)后,放入哈希表中位置将只能在0,2,4,6,8这几个数组位置上;
但我们如果把base取7(数组大小甚至比10小),同样数列取模后(0,6,5,4,3,2,1,0,…),可以分布在哈希表中的0,1,2,3,4,5,6所有位置上;
所以可以使得哈希表中每个位置都有用武之地。
Hash的用途很多,我们在使用Ngnix做负载均衡的时候,同样用的也是Hash的方式。总的来说,要是数据分布均匀一些,在这种时候就可以考虑使用Hash的方式对数据进行处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值