增强for遍历的原理是什么?冒号右边允许哪些类型的实体类?

 @Test
    public void m1(){
        HashMap<String,String> hashMap=new HashMap<>();
        hashMap.put("a", "jack");
        hashMap.put("b","alice");
        for(Map.Entry<String,String> entry:hashMap.entrySet()){
            System.out.println(entry.getKey()+"--"+entry.getValue());
        }
    }

如题,学习遍历HashMap时想到的,老师只说for循环能遍历集合,但我想知道具体是哪些类型的集合可以遍历?还是说只要实现Collection接口都能遍历?

阅读 3.1k
3 个回答

自定义一个什么接口都没实现的对象,产生一个实例用到 for(:) 中去,就会看到错误消息

image.png

这个消息告诉你只有数组和 Iterable 可以放在冒号右边(称为可迭代)。

看 Java API 文档,可以发现 Collection 接口是从 Iterable 继承的。所以只要实现了 Collection 的类都是 Iterable,可以迭代。

对于Java中的集合,只要实现了Iterable接口,就可以使用foreach循环或者迭代器进行遍历。Iterable接口继承自java.util.Collection,因此所有实现了Collection接口的集合类都可以遍历。包括但不限于ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等。需要注意的是,Map接口不继承自Collection接口,因此遍遍历Map需要使用其keySet()、values()或者entrySet()方法获取其键、值或键值对的集合,然后再进行遍历。

增强for循环,是java提供的语法糖,等同于迭代器模式的for循环

Iterator it = obj.iterator();
while(it.hasNext()){
    do something with it.next()
}

所以本质上实现了迭代器接口(Iterable::iterator())的对象,都支持增强for循环。
像Collection Framework全家,数组,都可以

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏