我在看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()方法,上面的代码是通过一个匿名实现类实现的