zoukankan      html  css  js  c++  java
  • Arraylist JDk1.8扩容和遍历

    Arraylist作为最简单的集合,需要熟悉一点,记录一下---->这边主要是注意一下扩容和遍历的过程

    请看以下代码

      public static void main(String[] args) {
    
            List<String> list = new ArrayList<String>();
            list.add("a");
            list.add("b");
            list.add("c");
            list.add("d");
            list.add("e");
            list.add("f");
            Iterator iterator = list.iterator();
            while(iterator.hasNext()){
                String str = (String) iterator.next();
                if(str.equals("a")){
                    list.remove(str);
                }else{
                    System.out.println(str);
                }
            }
        }

    执行结果 发生了异常!for遍历的时候进行删除和添加操作,也会出现异常!

    这是因为

    Iterator遍历的时候 fail-fast的检查机制
       private class Itr implements Iterator<E> {
            int cursor;       // index of next element to return
            int lastRet = -1; // index of last element returned; -1 if no such
            int expectedModCount = modCount;//每次add或remove 都会增加1(有点类似于记录改变集合数据的行为),遍历的时候初始化
    
            public boolean hasNext() {
                return cursor != size;
            }
    
            @SuppressWarnings("unchecked")
            public E next() {
                checkForComodification();//校验遍历的时候是否修改了记录
                int i = cursor;
                if (i >= size)
                    throw new NoSuchElementException();
                Object[] elementData = ArrayList.this.elementData;
                if (i >= elementData.length)
                    throw new ConcurrentModificationException();
                cursor = i + 1;
                return (E) elementData[lastRet = i];
            }
    
      final void checkForComodification() {
                if (modCount != expectedModCount)//判断是否相等
                    throw new ConcurrentModificationException();
            }
        }

    扩容问题,其实也很简单

       private void grow(int minCapacity) {
            // overflow-conscious code
            int oldCapacity = elementData.length;
            int newCapacity = oldCapacity + (oldCapacity >> 1);
            if (newCapacity - minCapacity < 0)//这边当oldCapacity大到一定程度的时候,向右移动会变成很大的负数,所以才有这个判断
                newCapacity = minCapacity;
            if (newCapacity - MAX_ARRAY_SIZE > 0)
                newCapacity = hugeCapacity(minCapacity);
            // minCapacity is usually close to size, so this is a win:
            elementData = Arrays.copyOf(elementData, newCapacity);
        }
    

      简单的学习下

  • 相关阅读:
    storm 学习教程
    Scala 面向接口编程
    Scala 继承
    IntelliJ IDEA 代码检查规范QAPlug
    Spark入门实战系列
    IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!)
    使用DOM解析XML文档
    栈结构Stack
    队列Queue ,双端队列Deque
    集合转换为数组toArray(),数组转换为集合asList()
  • 原文地址:https://www.cnblogs.com/jinjian91/p/8870247.html
Copyright © 2011-2022 走看看