精华内容
下载资源
问答
  • java增强for循环原理
    2021-10-14 14:23:08

    通过反编译源码,我们看到,其实JAVA中的增强for循环底层是通过迭代器模式来实现的。

    增强for循环实现原理


    编译前

    for (Integer i : list) {
       System.out.print(i + ",");
    }



    编译后

    Integer i;
    for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(i)){
       i = (Integer)iterator.next();        


    源码解析Integer i; 定义一个临时变量i
     

    Iterator iterator = list.iterator(); 获取List的迭代器
    iterator.hasNext(); 判断迭代器中是否有未遍历过的元素
    i = (Integer)iterator.next(); 获取第一个未遍历的元素,赋值给临时变量i
    System.out.println(i) 输出临时变量i的值

    更多相关内容
  • 增强的for循环是在传统的for循环中增加的强大的迭代功能的循环,是在jdk1.5之后提出来的。下面这篇文章主要给大家介绍了关于Java增强for循环的实现原理和坑的相关资料,需要的朋友可以参考下
  • Java 增强for循环原理

    千次阅读 2017-05-04 13:06:17
    [Java]增强for循环原理Java语言中循环遍历的方式有多种常见的有:for循环、增强for循环、while循环、do while循环、迭代器。最近在学习java Collection集合的原理,发现了集合中增强for循环的实现原理,突然对曾经...

    在Java语言中循环遍历的方式有多种常见的有:for循环、增强for循环、while循环、do while循环、迭代器。

    最近在学习java Collection集合的原理,发现了集合中增强for循环的实现原理,突然对曾经不懂的和懵懂的问题有了新的理解,在此记录一下,对于java初学者和想对深层理解的朋友有一定的帮助。

    首先增强for循环是在JDK1.5中被加入使用。
    1.5 及以上的编译器隐藏了基于iteration和下标遍历的内部实现。

    废话不多说,先上一段简单的增强for循环的代码:

    public static<AnyType> void print(Collection<AnyType> colls){
        for(AnyType item : colls){
            System.out.print(item);
        }
    }

    这里要提一句只有实现Iterable接口的那些类可以拥有增强for循环。

    那么问题来了,为什么这么设计呢?

    上一段Iterable接口的源码和注释先看一下

    package java.lang;
    
    import java.util.Iterator;
    
    /**
     * Instances of classes that implement this interface can   
     * be used with the enhanced for loop.
     * @since 1.5
     */
    public interface Iterable<T> {
        /**
         * Returns an {@link Iterator} for the elements in 
         * this object.
         * @return An {@code Iterator} instance.
         */
        Iterator<T> iterator();
    }

    然后再看Collection类的源码

    package java.util;
    public interface Collection<E> extends Iterable<E> {
        /**
        ...
        **/
    }

    通过注释我们可以看出,Collection类有实现了Iterable这个接口才可以用增强for循环。
    所以我们就可以想到所有实现Collection接口的类或其子类如ArrayList、LinkedList、LinkedHashSet等都可以使用增强for循环的。

    再回到刚刚的问题,为什么这么设计?
    带着问题我们先从实现原理分析:
    以AbstractCollection.java为例

    package java.util;
    public abstract class AbstractCollection<E> implements Collection<E> {
        /**
        ...
        **/
        /**
         * Returns an instance of {@link Iterator} that may 
         * be used to access the
         * objects contained by this {@code Collection}. The order in which the elements are
         * returned by the {@link Iterator} is not defined unless the instance of the
         * {@code Collection} has a defined order.  In that case, the elements are returned in that order.
         * <p>
         * In this class this method is declared abstract and has to be implemented
         * by concrete {@code Collection} implementations.
         *
         * @return an iterator for accessing the {@code Collection} contents.
         */
        public abstract Iterator<E> iterator();
    }

    AbstractCollection类实现了Iterable接口必须提供一个iterator的方法,该方法返回一个Iterator类型的对象。Iterator接口的思路是通过iterator方法,每个集合均可创建并返回给开发者一个实现Iterator接口的对象,并将当前位置的概念在对象内部存储下来。

    Iterator接口源码

    public interface Iterator<E> {
    
        public boolean hasNext();
    
        public E next();
    
        public void remove();
    }
    • next()每次调用都给出集合的下一项。
    • hasNext()用来告诉是否存在下一项。
    • remove()删除有next()最新返回的项。

    所以第一个增强for循环的代码可以写成

    public static<AnyType> void print(Collection<AnyType> colls){
        Iterator<AnyType> iterator = calls.iterator();
        while(iterator.hasNext()){
            AnyType anyType = iterator.next();
            System.out.print();
        }
    }

    有以上可以看出增强for循环是基于Iterator来实现的。
    由于增强for循环是基于Iterator实现的所以有些情况下增强for循环的执行效率会低于Iterator的效率。

    拙见,有不足之处请指点。

    展开全文
  • java增强for循环原理 增强for循环的语句如下: for(ElementType element:arrayName){}; 遍历数组 int[] arr = {1,2,3}; for(int i = 0; i < arr.length; i++) { System.out.println(arr[i]);//1,2,3 } for(int...

    java中增强for循环的原理 增强for循环的语句如下: for(ElementType element:arrayName){}; 遍历数组 int[] arr = {1,2,3}; for(int i = 0; i < arr.length; i++) {   System.out.println(arr[i]);//1,2,3 } for(int e : arr) {   System.out.println(e);//1,2,3 } 遍历List List list = new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("ccc"); for(int i = 0; i < list.size(); i++) {   String s = list.get(i);   System.out.println(s); } for(String s : list) {   System.out.println(s); } 遍历Set Set set = new HashSet(); set.add("a"); set.add("b"); set.add("c"); Iterator it = set.iterator(); while(it.hasNext()) {   System.out.println(it.next()); } for(String s : set) {   System.out.println(s); } 遍历Map Map map = new HashMap(); map.put("a", "a"); map.put("b", "b"); map.put("c", "c"); Set> entrySet = map.entrySet(); for(Entry entry : entrySet) {   System.out.println(entry.getKey() + "=" + entry.getValue()); } 原理 任何实现了iterable接口的类,都有返回iterator的方法,也就是说其实增强for循环的底层是迭代器,任何实现了iterable接口的类都可以使用增强for循环来遍历。 下面就通过一个具体的事例来说明 class demo implements Iterable{ private String patm; public demo(String patm) { this.patm = patm; } public Iterator iterator() { return new Iterator() { private String[] dmeoArray = patm.split("\\s+");//使用正则表达式处理空格 private int index = 0;//表示从0下标开始遍历! public boolean hasNext() { return index < demoArray.length; } public String next() { return demoArray[index++]; } public void remove() { throw new UnsupportedOperationException("error"); } }; 使用JUNIT测试方法如下 @Test public void fun() { demo d = new demo("demo1 demo2 demo3 demo4"); for(String s : d) { System.out.println(s); } } 输出的结果将遍历整个数组。

    展开全文
  • 转载: ... 在JAVA中,遍历集合和数组一般有以下三种形式: 第一种是普通的for循环遍历、第二种是使用迭代器...可以看到,第三种形式是JAVA提供的语法糖,这里我们剖析一下,这种增强for循环底层是如何实现的。 ...

    转载:

    https://mp.weixin.qq.com/s/GWelJIRYBEW3VT8JdQa4IA

    在JAVA中,遍历集合和数组一般有以下三种形式:

    第一种是普通的for循环遍历、第二种是使用迭代器进行遍历,第三种我们一般称之为增强for循环(for each)。

    实现原理

    可以看到,第三种形式是JAVA提供的语法糖,这里我们剖析一下,这种增强for循环底层是如何实现的。

    我们对以下代码进行反编译

    反编译后:

    反编译后的代码其实比较复杂,我们按照执行顺序拆解一下:

    如此循环往复,直到遍历完List中的所有元素。

    通过反编译,我们看到,其实JAVA中的增强for循环底层是通过迭代器模式来实现的。

    增强for循环的坑

    这里说是增强for循环的坑,其实主要是因为有些人不了解增强for循环的实现原理而可能踩入的坑。

    既然增强for循环通过迭代器实现,那么必然有迭代器的特性。

    Java中有fail-fast机制。在使用迭代器遍历元素的时候,在对集合进行删除的时候一定要注意,使用不当有可能发生ConcurrentModificationException,这是一种运行时异常,编译期并不会发生。只有在程序真正运行时才会爆发。

    如以下代码:

    会抛出ConcurrentModificationException异常。

     

    所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。

    但你可以使用 Iterator 本身的方法 remove() 来删除对象,Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

    正确的在遍历的同时删除元素的姿势:

    好啦,这里给你介绍了增强for循环的实现原理,以及使用不当可能踩入的坑。所以,虽然是一个简单的for-each语法,但是也要了解其原理,不然可能导致一些莫名其妙的问题。

    展开全文
  • 增强for循环迭代集合时,底层使用的时集合的迭代器。
  • JAVA中,遍历集合和数组一般有以下三种形式:for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i) + ",");}Iterator iterator = list.iterator();while (iterator.hasNext()) {System.out....
  • Java增强for循环总结

    千次阅读 2021-02-26 10:19:36
    1 增强for循环增强for循环是for的一种新用法!用来循环遍历数组和集合。1.1 增强for的语法for(元素类型 e : 数组或集合对象) {}例如:int[] arr = {1,2,3};for(int i : arr) {System.out.println(i);}增强for的...
  • 增强for循环的使用(遍历集合和数组)
  • 前言 循环就是让我们的程序重复地执行某些业务。在程序设计时,需要处理大量的重复动作,采用循环结构可以降低程序书写的长度和复杂度,可使...一、增强for循环1. 三种常用for循环#普通for循环遍历 for (int i = 0;
  • Java中的增强for循环

    2021-11-06 14:13:16
    增强for:简化数组和Collenction集合的遍历 实现Iterable接口的类允许其对象成为增强型for语句的目标 它是JDK5之后出现的,其内部原理是一个Iteractor迭代器 简单方便 增强for的格式 格式: for(元素数据类型 ...
  • 增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作 文章目录前言一、增强...
  • 刷题时想用增强for循环来给初始数组赋值,结果发现了问题。所以记录学习一下增强for循环的用法。 1. 增强for循环 增强for循环是for的一种新用法!用来循环遍历数组和集合。 2. 语法 for (元素类型 e : 数组或...
  • Java中的增强for循环

    千次阅读 2021-10-11 15:43:02
    增强for循环定义如下: for(ElementType element: arrayName){}; 例1: int[] num = {1,2,3,4,5,6}; for(int i: num){ System.out.print(i); } 例2: int[] num = {1,2,3,4,5,6}; for(int i = 0; i <...
  • JAVA中,遍历集合和数组一般有以下三种形式: for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + ","); } Iterator iterator = list.iterator(); while (iterator.hasNext()) { ...
  • java1.5版本引入了一个增强for循环,基本原理和for循环类似。语法声明:for(表达式:条件表达式)举例:for (String str : set)解释:set代表set集合,str代表set集合中存放的类型。代码示例如下:Set set = new ...
  • 增强 For 循环

    2021-08-21 19:37:49
    也成为【for each】循环,是JDK1.5版本以后出来的一个高级for循环,专门用来遍历数 组和集合的,它的内部原理其实就是iterator迭代器,所以在遍历过程中,不能对集合的元素 进行增删操作。 二、格式 for( 元素...
  • java for循环的解释

    2021-02-12 20:43:06
    展开全部java for循环就是,对于某些操作,人为地控制循环次数。最简单的,比如打印e68a84e8a2ad62616964757a686964616f31333337623536数字。举例:打印 0 ~ 100for(inti=1;i<=100;i++){System.out.println(i);}在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,617
精华内容 10,646
关键字:

java增强for循环原理