package cn.mldn.demo;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestDemo {
public static void main(String[] args) throws Exception {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(3, "张三");
map.put(3, "李四"); // key重复,value会被新内容覆盖
map.put(1, "王五");
map.put(0, "赵六");
Set<Map.Entry<Integer, String>> set = map.entrySet();
Iterator<Map.Entry<Integer, String>> iter = set.iterator();
while (iter.hasNext()) {
Map.Entry<Integer, String> me = iter.next();
System.out.println(me.getKey() + "," + me.getValue());
}
}
}
map.entrySet()返回的是Set接口的实例化,接口中的方法都是抽象方法,为什么可以直接调用呢:set.iterator()
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class TestDemo {
public static void main(String[] args) throws Exception {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(3, "张三");
map.put(3, "李四"); // key重复,value会被新内容覆盖
map.put(1, "王五");
map.put(0, "赵六");
Set<Map.Entry<Integer, String>> set = map.entrySet();
Iterator<Map.Entry<Integer, String>> iter = set.iterator();
while (iter.hasNext()) {
Map.Entry<Integer, String> me = iter.next();
System.out.println(me.getKey() + "," + me.getValue());
}
}
}
map.entrySet()返回的是Set接口的实例化,接口中的方法都是抽象方法,为什么可以直接调用呢:set.iterator()
public Set entrySet()
{
return entrySet0();
} private Set entrySet0()
{
Set set = entrySet;
return set == null ? (entrySet = new EntrySet()) : set;
} private final class EntrySet extends AbstractSet
Set<Map.Entry<Integer, String>> set = map.entrySet();
对应jdk源码:
public Set<Map.Entry<K,V>> entrySet() {
return entrySet0();
} private Set<Map.Entry<K,V>> entrySet0() {
Set<Map.Entry<K,V>> es = entrySet;
return es != null ? es : (entrySet = new EntrySet());
}
entrySet0()方法返回的是一个EntrySet()源码:
private final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
public Iterator<Map.Entry<K,V>> iterator() {
return newEntryIterator();
}
public boolean contains(Object o) {
if (!(o instanceof Map.Entry))
return false;
Map.Entry<K,V> e = (Map.Entry<K,V>) o;
Entry<K,V> candidate = getEntry(e.getKey());
return candidate != null && candidate.equals(e);
}
public boolean remove(Object o) {
return removeMapping(o) != null;
}
public int size() {
return size;
}
public void clear() {
HashMap.this.clear();
}
}
EntrySet继承AbstractSet,AbstractSet实现了Set接口
代码如下:
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E>所以Set是在EntrySet中被实例化的。画了个关系图
希望能帮助到你!