集合&迭代器

101 阅读3分钟

集合概述

集合就是一种能够存储多个数据的容器。常见的容器有集合和数组。

集合有两大类:Collection(单列集合)、Map(双列集合)。

二者都是接口(也就是说无法实例化),集合类都是实现的这两个接口。在实际编程中经常使用的有 List、Set、Queue(这些是实现的 Collection 接口)HashMap、TreeMap、HashTable(这些实现的 Map 接口)

集合的体系(记忆)

1.单列集合 : Collection接口

    List接口 : 1 有序 2 有索引 3 元素可以重复
    
        ArrayList类 : 数组结构(查询快 , 增删慢)
        
        LinkedList类 : 链表结构(查询慢 , 增删快)

    Set接口 : 1 无序 2 无索引 3 元素唯一

        HashSet类 : 哈希表结构(保证数据唯一 , 查询速度快)

        TreeSet类 : 红黑树结构(可以对元素进行排序)

2.双列集合 : Map接口

    HashMap类 : 哈希表结构(保证键唯一 , 查询速度快)

    TreeMap类 : 红黑树结构(可以对键进行排序)

集合和数组的区别

  • 集合长度可变,数组长度固定,不能动态增大容量。
  • 集合只能存储引用数据类型(如果需要存储基本数据类型需要进行装箱),数组可以存储基本数据类型也可以存储引用数据类型。

迭代器

概述

迭代器是专门用来对Colection集合(单列集合)进行遍历使用的。学习迭代器的目的就是为了遍历集合。

迭代器和collection的关系

案例代码

package com.itheima.collection_demo.iterator_demo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
    如果获取一个Iterator对象
        Iterator it = 单列集合对象.iterator()

    Iterator : 接口 , 迭代器 , 用来遍历单列(Collection)集合
        boolean hasNext() : 判断是否存在下一个元素 , 如果存在返回true
        E next() : 拿到迭代的下一个元素 , 并把指针往后移动一位
        remove() :
 */
public class Demo {
    public static void main(String[] args) {
        // 泛型为String的集合对象
        Collection<String> c = new ArrayList<>();

        // 添加元素
        c.add("貂蝉");
        c.add("小乔");
        c.add("大乔");
        c.add("尚香");
        c.add("甄宓");

        // 遍历集合
        // 获取迭代器对象,迭代器也有泛型,跟集合对象保持一致即可
        Iterator<String> it = c.iterator();
        
    	// next方法一次只能拿一个,因此需要循环
        while(it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }
    }
}

迭代器使用的注意事项

当使用迭代器遍历集合, 采用集合对象修改了集合的长度(添加 , 删除) , 就会发生ConcurrentModificationException(并发修改异常)。

解决方案

  1. 迭代器遍历集合 , 迭代器修改集合的长度 , 建议使用!
  2. 不用迭代器遍历 , 可以采用普通for循环。

但是第二种方案无法对Collection接口定义的集合生效,因为for循环是根据索引进行遍历的,而Collection集合没有索引。List接口才可以实现,但是尽管如此,iterator是没有添加功能的,因此当你想执行添加数据操作时,什么接口都不好使,这个时候就需要拓展一下,要用到列表迭代器——public interface ListIterator extends Iterator,它有add方法,不过列表迭代器只能遍历List集合,仍然存在一定的局限性。

package com.itheima.collection_demo.iterator_demo;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Demo2 {
    public static void main(String[] args) {
        // 集合对象
        Collection<String> c = new ArrayList<>();

        // 添加元素
        c.add("貂蝉");
        c.add("小乔");
        c.add("大乔");
        c.add("尚香");
        c.add("甄宓");

        // 判断是否存在小乔 , 如果存在删除小乔
        Iterator<String> it = c.iterator();
        while (it.hasNext()) {
            String s = it.next();
            if (s.equals("小乔")) {
                // c.remove();  会报错
                it.remove();
            }
        }

        System.out.println(c);
    }
}