码迷,mamicode.com
首页 > 其他好文 > 详细

集合1

时间:2018-11-08 13:44:57      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:arrays   ESS   action   main   不可   code   分类   泛型   迭代   

集合

  • 创建集合时不跟泛型

    编译器检查不出元素的类型,取元素时需要强转,若强转类型不对则报异常

  • 使用Arrays.asList()生成的List

    进行add()或delet()操作运行时会出异常,因为Arrays.asList()的底层为数组,长度不可改变

  • 分类

    • Collection

      1. List

        ArrayList LinkedList

      2. set
      3. queue

    • map

List

ArrayList

add(int index, E element) 将指定的元素插入此列表中的指定位置。
默认使用System.arraycopy方法进行挪移元素

  • 线程不安全:
    List list = Collections.synchronizedList(new ArrayList(...));//进行同步

  • 容量大小和元素个数的关系??

  • default关键字(虚拟扩展方法),List接口实现了sort()方法,可以在接口里对方法实现

迭代器

Iterator

  1. boolean hasNext() 如果仍有元素可以迭代,则返回 true
  2. E next() 返回迭代的下一个元素
  3. void remove() 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)
  4. default void forEachRemaining(Consumer<? super E> action)

ArrayList迭代器如下

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;

    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];
    }
  • 不允许在foreach里删除或添加操作(来自<<阿里巴巴Java开发手册>>)

      List<String> a = new ArrayList<>();
      a.add("1");
      a.add("2");
      for (String string : a) {
          if("2".equals(string)) {
              a.remove(string);
          }
          System.out.printlb(String);
      }

    异常: java.util.ConcurrentModificationException

    分析:

    1. remove("1")

      第一轮: cussor=0,size=2,取出"1"后cussor+1,删除"1"后size=1

      第二轮: cussor=1,size=1, 经hasNext()判断结束循环,元素"2"没有得到遍历

    2. remove("2")

      第一轮: cussor=0,size=2,取出"1"后cussor+1,size不变

      第二轮: cussor=1,size=2, 取出"2"后cussor+1,删除"2"后size=1

      第三轮: cussor=2,size=1,hasNext()为true不能结束循环,此时进入next()方法内的checkForComodification()方法就抛出异常

集合1

标签:arrays   ESS   action   main   不可   code   分类   泛型   迭代   

原文地址:https://www.cnblogs.com/mdc1771344/p/9928480.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!