Collection 集合

54 阅读7分钟

Collection 集合的体系图

collection 集合的体系图.jpg

Collection 集合介绍

Collection 是单列集合的祖宗接口,他的功能是全部单列集合都可以继承使用的。
Collection 集合又分为list和set两类
    * List系列集合特点:
        1.添加的元素有序,可重复,有索引。
        2.有序:存和取的顺序是一样的;
        3.可重复:集合中存的元素是可以重复的;
        4.有索引:可以通过索引获取集合中的元素;
    * Set系列集合特点:
        1.添加的元素无序,不重复,无索引。
        2.无序:存和取的数据有可能不一样;
        3.不重复:元素不能重复(利用这个特性可以做数据去重);
        4.无索引:不能通过索引获取元素;

Collection 类常用方法

public interface Collection<E> extends Iterable<E> {
    /**
     * 添加元素
     * 1.如果往list系列集合中添加数据,add方法永远返回true(list系列集合元素可重复);
     * 2.如果往set系列集合中提那家数据,如果要添加的元素存在就返回false,如果要添加的元素不存在就返回trueset系列集合元素不重复);
     */
    boolean add(E e);

    /**
     * 清空所有元素
     */
    void clear();

    /**
     * 移除元素
     * 1.因为 Collection 中定义的都是共性方法,所以此时不能用索引删除(set系列集合没有索引),只能通过对象删除;
     * 2.如果要删除的元素不存在,返回false,否则返回true;
     */
    boolean remove(Object o);

    /**
     * 是否包含某个元素
     * 1.底层是依赖equals方法进行判断是否存在的。
     * 2.如果集合中存的是自定义对象,也行通过contains方法来判断是否包含,需要在javaBean中重写equals方法。 
     * 3.如果存的自定义对象没有重写equals方法,就会使用父类Object中的equals方法进行判断,Object类的equals方法是根据地址值来判断对象是否相等的;
     * 4.需求,自定义对象中,如果需要根据属性值判断是否是同一个元素,该怎么办?重写equals方法,系统会自动生成该方法,通过属性去判断是否是同一个对象;
     */
    boolean contains(Object o);

    /**
     * 集合是否为空
     * 1.底层直接判断size==0,然后返回结果
     */
    boolean isEmpty();

    /**
     * 集合的长度、元素的个数
     */
    int size();
}

Collection 的遍历方式

Collection 的遍历方式
    1.迭代器
    2.增强for循环
    3.Lambda表达式遍历


注意:
1.Collection 的子类有list和set两种,set集合没有索引,是不能使用普通for循环的。

Collection 类常用方法1:迭代器

迭代器:
* 特点:不依赖索引;
* 类:迭代器在java中的类是Iterator,迭代器是集合转用的遍历方式;
* 使用:
    Collection集合获取迭代器的方法:
        * Iterator<E> iterator();// 返回迭代器对象,默认指向当前集合的0索引;
    Iterator的常用方法:
        * boolean hasNext();// 判断当前位置是否有元素,有返回true,没有返回false。
        * E next();// 获取当前位置的元素,并将迭代器对象移向下一个位置。
* 代码示例:        
    Collection<String> list = new ArrayList();// 创建集合对象(多态)
    list.add("aaa");// 添加数据
    list.add("bbb");
    list.add("ccc");

    // 迭代器遍历集合
    Iterator<String> iterator = list.iterator();// 创建迭代器对象,创建指针
    while (iterator.hasNext()) {// boolean hasNext = iterator.hasNext();// 判断是否有元素
        String str = iterator.next();// 1.获取元素,2.移动指针
        System.out.println("------>> " + str);
    }

* 使用迭代器需要注意的细节
    1.如果迭代器指向的位置没有对象,强行调用next方法会报NoSuchElementException(没有这个元素异常);
    2.迭代器遍历结束后,指针是不会复位的,如果需要再次遍历,只能再次获取一个新的迭代器对象;
    3.循环中只能用一次next方法;
    4.迭代器遍历时,不能用集合的方法进行增加或者删除;
    

* 总结:
    1.迭代器在遍历集合的时候是不依赖索引的(是通过创建指针,并且移动指针的方式获取集合中的每一个元素);
    2. 迭代器中需要掌握的三个方法
        * Iterator<E> iterator = 集合对象.iterator();// 获取迭代器对象
        * boolean b = iterator.hasNext();// 当前位置是否有元素
        * E e = iterator.next();// 获取当前位置的元素,并将指针移到下一个位置
    3.迭代器的4个小细节:
        1.如果当前位置没有元素,还要强行获取,会报NoSuchElementException(没有这个元素异常);
        2.迭代器遍历完毕,指针是不会复位的;
        3.迭代器遍历中,只能调用一次next方法;
        4.迭代器遍历时,不能使用集合的方法进行增加或者删除;
        
        
        
MST - 迭代器

Q1:Collection 集合有那些遍历方法?
A:遍历方法有
    * 迭代器
    * 增强for循环
    * Lambda表达式遍历

Q2:Collection 集合用迭代器遍历的时候,next方法能调用多次吗?为什么?
A:迭代器在遍历的时候,获取每个元素的时候只能调用一次next方法。
   因为调用一次next方法,做了两件事,"获取当前位置的元素,并将指针移到下一个位置",如果调用多次,当遍历到最后一个位置的时候,hasNext方法返回true,此时会调用多次next方法,导致指针移动了多次,并且获取元素的时候已经没有了,会报NoSuchElementException(没有这个元素异常)。
   迭代器遍历的时候要保证移动一次调用次;

Q3:迭代器遍历的时候,如果强行使用next方法获取没有元素的位置,会发生什么?
A:会报NoSuchElementException(没有这个元素异常)。

Q4:为什么报的是"没有这个元素"异常,而不是"下标越界"异常?
A:因为这个集合没有索引。

Q5:用迭代器遍历集合的时候能不能调用集合的添加和移除方法?
A:不能。
   * 迭代器遍历的时候调用集合的添加和删除方法会报ConcurrentModificationException(并发修改异常)。
   * 如果要添加,暂时没有方法。
   * 如果要在迭代器遍历的时候删除元素,可以调用迭代器自带的remove方法进行删除元素)(iterator.remove())。
   

Collection 类常用方法2:增强for

1.什么是增强for遍历?
    * 增强for的底层就是迭代器,为了简化迭代器的代码书写而来的。
    * JDK5之后出现的,其内部原理就是一个Iterator迭代器。 
    * 所有的单列集合和数组才能用增强for进行遍历。

2.增强for的代码格式
    for(元素的数据类型 变量名 : 数组或者集合){
        // your code
    }
    例如:
    for (String s : list) {
        System.out.println(s);
    }

3.细节
    1.修改增强for中的变量,不会改变集合中本来的数据
        Collection<String> list = new ArrayList();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        for (String s : list) {
            // 这个s就是一个第三方变量,和原本的集合之间没有太大的关系
            s = "kkk";// 修改增强for中的变量,不会改变集合中本来的数据
        }
        System.out.println(list);// 输出结果:[aaa, bbb, ccc]



MST:增强for

Q1:增强forIterator有啥区别?
A:
    1.代码书写区别:增强for代码书写简单,迭代器相对来说麻烦;
    2.增强for循环是流程控制语句,Iterator是遍历对象;
    3.增强for不会出现异常,迭代器会报异常;
    

Collection 类常用方法3:Lambda表达式遍历

JDK8的新技术Lambda表达式,提供了一种更简单,更直接的遍历集合的方式;
方法:
    * default void forEach(Consumer<? super T> action)// 结合Lambda遍历集合

代码演示:
    list.forEach(s -> System.out.println(s));

Collection 总结

1.Collection是单列集合的顶层接口,所有方法被List和Set系列集合共享;
2.常见成员方法
    * add
    * clear
    * remove
    * contains
    * isEmpty
    * size
3.三种通用的遍历方式
    * 迭代器:在遍历的过程中要删除元素用迭代器;
    * 增强for
    * Lambda表达式