jdk1.8 HashMap的keySet方法详解

我在看HashMap源码的时候有一个问题让我产生了兴趣,那就是HashMap的keySet方法,没有调用HashMap的有关数据的任何方法就能获取到map的所有的键,他是怎么做到的,然后我就通过模拟keySet方法得到了答案;

下面是代码:

package test;

import java.util.AbstractSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MyMap {

    public static void main(String[] args) {
        MyMap ss = new MyMap();

        ss.put("77", "WW");
        ss.put("22", "EE");
        ss.put("33", "FF");
        ss.put("44", "FF");
        Set set = ss.myKeySet();
        System.out.println(set);

    }

    public Map kk = new HashMap();

    public Set keySet;

    // 模拟hashMap的keySet方法
    public Set myKeySet() {
        Set set = keySet;
        if (set == null) {
            set = new KeySet();
        }
        return set;
    }

    // 添加的方法
    public void put(String key, Object value) {
        this.kk.put(key, value);
    }

    // 模拟hashMap中的KeySet内部类
    class KeySet<E> extends AbstractSet {
        @Override
        public final Iterator iterator() {
            // 返回一个匿名的迭代器实现类,并重写hashNext()、next()方法
            Iterator iterator= new Iterator<E>() {
                Iterator<Map.Entry<String, Object>> i = kk.entrySet().iterator();

                @Override
                public boolean hasNext() {
                    return i.hasNext();
                }

                @Override
                public E next() {
                    return (E) (i.next().getKey());
                }
            };
            
            return iterator
        }

        @Override
        public int size() {
            // TODO Auto-generated method stub
            return 0;
        }
    }

}

其实是KeySet类间接的重写了abstractSet抽象类中实现的set接口中的iterator()方法,此方法返回一个iterator对象,同时还需要重写iterator接口的hashNext()、next()方法,上面的代码是通过一个匿名实现类实现的

原文地址:https://www.cnblogs.com/shianliang/p/9230355.html