• 关于List的remove()方法


    最近遇到一个小问题,我将其简化为下列代码,List的remove()方法在下列颜色注重的代码执行的源码也是不同的~

            List<Integer> list=new ArrayList<>();
            list.add(11);
            list.add(12);
            list.add(13);
            list.add(14);
            list.add(15);
            list.add(16);
            
            /*for (Integer i=0; i<list.size(); i++) {
                if (list.get(i) % 2 == 0) {        
                    list.remove(i);   //执行删除指定位置的元素的功能     执行结果 [11,12,13,14,15,16]
                }
            }*/
            for (int i=0; i<list.size(); i++) {
                if (list.get(i) % 2 == 0) {
                    list.remove(i);   //执行删除指定元素的功能          执行结果 [11,13,15]
                }
            }
            for(Integer i : list){
                System.out.println(i);
            }
        }     

    上述执行的代码中remove调用的不是同一个方法分别是list重写的两个remove方法,分别为

        public E remove(int index); //执行删除指定位置的元素的功能
        public boolean remove(Object o)  //执行删除指定元素的功能
     // 删除ArrayList指定位置的元素
        public E remove(int index) {
            RangeCheck(index);//检查index是否超出list大小范围,否则抛出异常
            modCount++;
            E oldValue = (E) elementData[index];//elementData是实现list的数组
            int numMoved = size - index - 1;//当执行删除操作是后面的元素全部向前面移动一位
            if (numMoved > 0)
                System.arraycopy(elementData, index+1, elementData, index,
                     numMoved);
            elementData[--size] = null;
            return oldValue;
        }
        // 删除ArrayList的指定元素
        public boolean remove(Object o) {
            if (o == null) {
              for (int index = 0; index < size; index++)
                 if (elementData[index] == null) {
                     fastRemove(index);
                    return true;
                }
            } else {
                for (int index = 0; index < size; index++)
                  if (o.equals(elementData[index])) {
                      fastRemove(index);
                      return true;
                  }
            }
            return false;
       }
      //快速删除第index个元素
      private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; }
  • 相关阅读:
    高仿爱鲜蜂购物应用源码
    控制ClistCtrl的滚动的位置
    VC保存当面某个区域的图片
    MFC 屏幕截图方法
    回调函数使用(三)
    回调函数使用方法二
    VS2010编译Boost 1.57 静态链接库
    Windows7+VS2010下OpenGL的环境配置
    CxImage图像库的使用 .
    VS2010+PCL配置
  • 原文地址:https://www.cnblogs.com/whiteme/p/8066109.html
Copyright © 2020-2023  润新知