首页 资讯 社群 我的社区 搜索

没有下标就不能用for遍历?java关于for的用法

高大上
2019-05-10 17:38:06

今天看同事写代码时发现:他想遍历一个map,但是map是没有下标的。于是他就将map转换为Set。然后写了个for。我当时就在想,这玩意不是应该用Iterator吗?
set同样是没有下标的,按道理来说也是无法使用for循环才对呀?

如下:

@Test
	public void contextLoads() {
		Set<String> strings = new HashSet<>();
		strings.add("a");
		strings.add("c");
		for (String s :strings){//第一种for循环
			System.out.println(s);
		}

		String[] arr = {"y","x","z"};
		for (int i=0;i<arr.length;i++){//第二种for循环
			System.out.println(arr[i]);
		}

	}

编译器没有报错,而且运行可以正常输出。

我原本以为for循环只能用于遍历有下标的对象结构,且两种for循环是等价的,看来并不是在这样的。

那么问题来了,for到底能遍历哪些对象?

在查看编译后的class文件后发现如下:

@Test
    public void contextLoads() {
        Set<String> strings = new HashSet();
        strings.add("a");
        strings.add("c");
        Iterator var2 = strings.iterator();//重点在这里

        while(var2.hasNext()) {
            String s = (String)var2.next();
            System.out.println(s);
        }

        String[] arr = new String[]{"y", "x", "z"};

        for(int i = 0; i < arr.length; ++i) {
            System.out.println(arr[i]);
        }

    }

编译器在将java文件编译为class文件时会做语法检查。

所有实现了Collection接口的对象,都可以使用for循环遍历。在编译后for会被翻译为Iterator迭代器。

所以才会出现无下标的对象也可以被遍历的情况。

用户评论