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()

解决方案 »

  1.   

    这个Set早在某个地方被实现,它拥有的是Set的类型的引用而已,实际对象可能是TreeSet啊,HashSet,这里不必关心了
      

  2.   

    严格地说,它不是一个 "Set对象",因为 Set 是抽象的,不可能直接派生对象,所以它一定是 "实现了 Set 接口的某个类的对象",这样去理解就合理了。
      

  3.   

    由于前面你实例的是HashMap,在HashMap源码中,对entrySet方法有具体实现。
     public Set entrySet()
        {
            return entrySet0();
        }    private Set entrySet0()
        {
            Set set = entrySet;
            return set == null ? (entrySet = new EntrySet()) : set;
        } private final class EntrySet extends AbstractSet
      

  4.   

    HashMap的entrySet方法的返回值是set接口的一个实现,这个实现类叫做EntrySet,所以就可以直接调用其相应的方法,set只是一个接口,没有实现的
      

  5.   

    我看了下源码,我想是这样的。
    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中被实例化的。画了个关系图
    希望能帮助到你!