zoukankan      html  css  js  c++  java
  • 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()方法,上面的代码是通过一个匿名实现类实现的

  • 相关阅读:
    Vi编辑器常用命令
    Notepad++常用命令——大大提升编码效率
    得到python某个模块的路径
    常用软件生命周期模型
    最常用的python实现
    Vi编辑器常用命令
    季羡林谈人生——意义和价值
    工业标准的品质也已成为开源世界中的范例之一
    《葵花宝典:WPF自学手册》三大网点书评集萃
    博文视点大讲堂37期 ——It's Android Time:程序员创富有道!
  • 原文地址:https://www.cnblogs.com/shianliang/p/9230355.html
Copyright © 2011-2022 走看看