jdk1.8 HashMap的keySet方法详解

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

下面是代码:

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(){
//返回一个匿名的迭代器实现类
return 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());
}
};
}

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

}

从eclipse复制过来格式有问题,你也可以把这个代码复制到eclipse中运行

其实是KeySet类间接的重写了abstractSet抽象类中实现的set接口中的iterator()方法,此方法返回一个iterator对象,因为map是键值对只需要返回他的键,所以还需要重写iterator接口的next()方法,所以上面的代码返回的是一个匿名实现类

猜你喜欢

转载自www.cnblogs.com/shianliang/p/9230355.html