Custom HashMap implementation

前端 未结 7 1865
挽巷
挽巷 2021-02-06 06:45

This question was asked to me in an interview. I think the only way to get best solution is SOF. So the question was \"How would you implement a custom HashMap in java(A

7条回答
  •  青春惊慌失措
    2021-02-06 07:01

    References: - http://javarevisited.blogspot.sg/2011/10/override-hashcode-in-java-example.html - http://javarevisited.blogspot.in/2011/02/how-to-write-equals-method-in-java.html

    class Entry {
        K key;
        V val;
    
        public K getKey() {
            return key;
        }
    
        public void setKey(K key) {
            this.key = key;
        }
    
        public V getVal() {
            return val;
        }
    
        public void setVal(V val) {
            this.val = val;
        }
    
        @Override
        public int hashCode() {
            int prime = 13;
            int mul = 11;
            if (key != null) {
                int hashCode = prime * mul + key.hashCode();
                return hashCode;
            }
            return 0;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }
            if (o == null || this.getClass().getName() != o.getClass().getName()) {
                return false;
            }
            Entry e = (Entry) o;
            if (this.key == e.key) {
                return true;
            }
            return false;
        }
    }
    
    public class HashMapImpl {
        private float loadfactor = 0.75f;
        private int capacity = 100;
        private int size = 0;
        private Entry table[] = new Entry[capacity];
    
        private int Hashing(int hashCode) {
            int location = hashCode % capacity;
            System.out.println("Location:"+location);
            return location;
        }
    
        public int size() {
            // TODO Auto-generated method stub
            return this.size;
        }
    
        public boolean isEmpty() {
            if(this.size == 0) {
                return true;
            }
            return false;
        }
    
        public boolean containsKey(Object key) {
            if(key == null) {
                if(table[0].getKey() == null) {
                    return true;
                }
            }
            int location = Hashing(key.hashCode());
            Entry e = null;
            try {
                e = table[location];
            }catch(NullPointerException ex) {
    
            }
            if(e!= null && e.getKey() == key) {
                return true;
            }
            return false;
        }
    
        public boolean containsValue(Object value) {
            for(int i=0; i e = null;
                try{
                    e = table[0];
                }catch(NullPointerException ex) {
    
                }
                if(e != null) {
                    return (V) e.getVal();
                }
            } else {
                int location = Hashing(key.hashCode());
                Entry e = null;
                try{
                e = table[location];
                }catch(NullPointerException ex) {
    
                }
                if(e!= null && e.getKey() == key) {
                    return (V)e.getVal();
                }
            }
            return ret;
        }
    
        public V put(K key, V val) {
            V ret = null;
            if (key == null) {
                ret = putForNullKey(val);
                return ret;
            } else {
                int location = Hashing(key.hashCode());
                if(location >= capacity) {
                    System.out.println("Rehashing required");
                    return null;
                }
                Entry e = null;
                try{
                e = table[location];
                }catch(NullPointerException ex) {
    
                }
                if (e!= null && e.getKey() == key) {
                    ret = (V) e.getVal();
                } else {
                    Entry eNew = new Entry();
                    eNew.setKey(key);
                    eNew.setVal(val);
                    table[location] = eNew;
                    size++;
                }
            }
            return ret;
        }
    
        private V putForNullKey(V val) {
            Entry e = null;
            try {
                e = table[0];
            }catch(NullPointerException ex) {
    
            }
            V ret = null;
            if (e != null && e.getKey() == null) {
                ret = (V) e.getVal();
                e.setVal(val);
                return ret;
            } else {
                Entry eNew = new Entry();
                eNew.setKey(null);
                eNew.setVal(val);
                table[0] = eNew;
                size++;
            }
            return ret;
        }
    
        public V remove(K key) {
            int location = Hashing(key.hashCode());
            V ret = null;
            if(table[location].getKey() == key) {
                for(int i=location; i hashMap = new HashMapImpl();
            hashMap.put(10, "Apple");
            hashMap.put(1, "Orange");
            hashMap.put(79, "Grape");
            System.out.println("Val at 79 "+hashMap.get(79));
            System.out.println("Val at 1 "+hashMap.get(1));
            System.out.println("Val at 10 "+hashMap.get(10));
            System.out.println("Val at 2 "+hashMap.get(2));
            hashMap.put(null, "Pear");
            System.out.println("Val at null "+hashMap.get(null));
            System.out.println("Hashmap has key at null:"+hashMap.containsKey(null));
            System.out.println("Hashmap has value at null:"+hashMap.containsValue("Pear"));
            System.out.println("Size of Map:"+hashMap.size());
        }
    
    
    }
    

提交回复
热议问题