zoukankan      html  css  js  c++  java
  • java与as3.0中for each使用的小陷阱

    在程序开发中for可以说是一个非常非常常出现的东西,特别是在数组里面处理的时候,来看一下for的简单用法

    for与for each

    我们在使用for时来一个非常常见的代码段

    //as3.0
    for(var i:uint=0;i<n;i++)
    {
         trace("i:"i);
         
    }
    
    //java
    
    for(int i=0;i<n;i++)
    {
       System.out.println("i:"i);
    }
    

    在写这里时我们都会说这个用起来很简单嘛,也没什么问题嘛,还讲个屁啊

    下面我们来看一个很容易引发的一个错误 

    来看一段代码

    ArrayList<int> arr=new ArrayList<int> ();
    
    arr.add(1);
    arr.add(2);
    arr.add(3);
    arr.add(4);
    arr.add(5);
    arr.add(6);
    arr.add(7);
    
    for(int i=0;i<arr.lenght;i++)
    {
            System.out.println(arr[i]);
            if(i==4)
                  arr.remove(i);
    }        
    

      大家看一下这个我们能打印出数组的全部数据吗?

          可以吃过亏的就知道这里我们一不小心就改了数组的长度,会导致我们遍历的时候跳过了某个元素。

          大家仔细看一下这个遍历过程就能发现问题

          这个问题的解决办法也很好解决只要把遍历反过来写就能避免有某些元素遍历不到的情况 

    ArrayList<int> arr=new ArrayList<int> ();
    
    arr.add(1);
    arr.add(2);
    arr.add(3);
    arr.add(4);
    arr.add(5);
    arr.add(6);
    arr.add(7);
    
    for(int i=arr.lenght-1;i>=0;i--)
    {
            System.out.println(arr[i]);
            if(i==4)
                  arr.remove(i);
    }  
    

     

    可能还有同学会想到用增强的 for循环,这个可以保证遍历所有的元素,而且经过我的测试 这个增强的 for循环不让我们在循环里动态改变这个数组的大小,所以也可以解决这个问题

    如果 我们强硬去改变它就会报一个java.util.ConcurrentModificationException的异常错误出来

    最近在as3.0遇到了一个更神奇的问题,就是这个东西这个增强for循环支持动态的改变正在遍历的数组长度,出现的问题就是上面的

    下面我们来过一下这个错误

    代码:

                          //as3.0
                        var arr:Array = [1,2,3,4,5] ;
    			for each (var i:int in arr) 
    			{
    				trace(i);
    				if(i==3)
    					arr.splice(arr.indexOf(1),1);
    			}
    			                    
    

      运行结果可想而知:

    1
    2
    3
    5
    

      这个跳了一下。没有遍历到全部元素,所以这个要小心了。也可见这个增强for在as3.0里用得是多么的不好。

     

    找一个博客做自己的女朋友,不管你跟她说什么她都帮你记录,这是多么幸福的一件事啊。如果有女生能做到这点,赶尽娶回家吧!
  • 相关阅读:
    ORM取数据很简单!是吗?
    谨慎使用反射机制
    AxeSlide软件项目梳理
    Uncaught Error: Cannot find module 'strip-ansi'
    vue 子组件data属性为啥必须是一个函数
    new FormData()
    computed methods watch filters
    关于template标签用法总结(含vue中的用法总结)
    区分http请求状态码来理解缓存(协商缓存和强制缓存)
    canvas绘制--圆角多边形
  • 原文地址:https://www.cnblogs.com/hexiaochun/p/3015456.html
Copyright © 2011-2022 走看看