zoukankan      html  css  js  c++  java
  • 自定义HashMap

    简易HashMap

    import java.util.Objects;//Objects类的equals方法是判断两个对象是否相等。
                            //在比较两个对象的时候,Object.equals方法容易抛出空指针异常。
    public class MyHashMap<K, V> {
    
        private class Entry<K, V>{      //将Entry定义为成员内部类,里面封装了Entry自己的put和get方法
            private K key;
            private V value;
            private long hash;
    
            private Entry<K, V> next;   //用next实现链表
            private Entry(K key, V value){
                this.key = key;
                this.value = value;
                this.hash = this.key.hashCode();
            }
            private void put(Entry<K, V> entry){
                if(this.hash == entry.hash && Objects.equals(this.key, entry.key)){
                    this.value = entry.value;   //覆盖
                }
                else{
                    if(Objects.isNull(this.next)){
                        this.next = entry;
                        size ++;        //这里不能用this.size;  this.size表示这个类的size,这里是内部类,直接使用外部的size
                    }else{
                        this.next.put(entry);   //递归
                    }
                }
            }
    
            private Entry<K, V> get(K key){
                if(Objects.equals(key, this.key))
                    return this;
                if(Objects.isNull(this.next))
                    return null;
                return this.next.get(key);  //递归
            }
        }
    
        private int size;
        private Entry[] entries;
        private static final int DEFAULT_LENGTH = 4;
    
        public MyHashMap(int entryLength){      //MyHashMap构造函数
            this.entries = new Entry[entryLength];
        }
        public MyHashMap(){       //MyHashMap<Integer, Integer> map = new MyHashMap<>();
            this(DEFAULT_LENGTH); //如上不指明哈希表的长度的时候,调用这个构造函数
        }
        public int size(){
            return this.size;
        }
        private int hash(K key){    //计算entries数组的下标
            return key.hashCode() % entries.length;
        }
    
        /**
         * MyHashMap自己的put,get方法,实际上利用内部类Entry的put,get方法
         * @param key
         * @param value
         */
        public void put(K key, V value){
            Entry<K, V> entry = new Entry<>(key, value);
            int index = this.hash(key);
            if(Objects.isNull(entries[index])){
                entries[index] = entry;
                size ++;
            }
            else{
                entries[index].put(entry);
            }
        }
    
        public V get(K key){
            int index = this.hash(key);
            if(Objects.isNull(entries[index]))
                return null;
            Entry<K, V> entry = this.entries[index].get(key);
            return entry == null ? null : entry.value;
        }
    
        public boolean isEmpty(){
            return this.size > 0;
        }
    
        //for test
        public static void main(String[] args) {
            MyHashMap<Integer, Integer> map = new MyHashMap<>();
            map.put(1,1);
            map.put(2,2);
            map.put(3,3);
            System.out.println(map.get(1));
            System.out.println(map.size());
        }
    }
  • 相关阅读:
    java面试和笔试大全
    Struts+Spring整合方式
    四、hibernate实体对象,事务管理,锁
    jdbc知识问答
    关于Struts框架简介
    EJB知识问答
    五、hibernate的Session操作, 查询过滤, 缓存利用, 批量处理
    spring IoC编程实例
    Hibernate简介
    简单的MySQL数据库连接例子
  • 原文地址:https://www.cnblogs.com/lyuwalle/p/13914090.html
Copyright © 2011-2022 走看看