24-集合--集合概述+Collection+Iterator

一、概述

1、集合是专门用于存储对象的,存的是对象的地址值

2、集合的特点:

(1)用于存储对象的容器(存的是对象的地址值)

(2)集合的长度是可变的(数组长度固定)

(3)集合中不可以存储基本数据类型 -- 基本数据类型通过自动拆箱/装箱可以转换成引用数据类型(数组可以存储基本数据类型)

3、集合因为内部的数据结构(对象的存储方式)不同,有多种具体容器

二、Collection

1、Collection extends Iterable:集合体系中的根接口,里面定义集合体系的共性方法(看顶层,用底层)

注:java.lang.Iterable<T> 接口只有一个 Iterator<T> iterator() 方法,返回一个迭代器。实现Iterable接口允许对象成为"foreach"语句的目标

2、方法

(1)添加

        boolean add(E e):添加指定元素,添加成功返回true(添加一个)

        boolean addAll(Collection<? extends E> c):将指定集合c中的所有元素都添加到collection中。重复的也添加进去(添加一堆)

(2)删除

        boolean remove(Object o):从collection中移除指定元素的单个实例,如果存在的话(删除一个)

        boolean removeAll(Collection<?> c):移除collection中那些也包含在指定集合c中的所有元素。此调用返回后,collection中将不包含任何与指定集合c相同的元素(删除一堆)

        void clear():移除collection中的所有元素(清空集合中的所有元素,集合还在)

注:删除的方法有两个:(1)delete()    (2)remove()。删除都会做长度改变的动作

(3)判断

        boolean contains(Object o):如果collection包含指定的元素,则返回true(包含一个)

        boolean containsAll(Collection<?> c):如果collection包含指定集合c中的所有元素,则返回true(包含一堆)

        boolean isEmpty():如果collection不包含元素,则返回true(判断集合中是否有元素)

(4)获取

        int size():返回collection中的元素数(获取长度)

        Iterator<E> iterator()取出元素的方式:迭代器。返回在collection的元素上进行迭代的迭代器。关于元素返回的顺序没有任何保证(除非此collection是某个能提供保证顺序的类实例)

注:获取长度的方法有两个:(1)length()    (2)size()

(5)其他

        boolean retainAll(Collection<?> c):仅保留collection中那些也包含在指定集合c的元素(取交集)。换句话说,移除collection中未包含在指定集合c中的所有元素。和removeAll()相反

        Object[] toArray():返回包含collection中所有元素的数组。如果collection对其迭代器返回的元素顺序做出了某些保证,那么此方法必须以相同的顺序返回这些元素(将集合转成数组)

        Collection c = new ArrayList();
        c.add("ab");
        Object[] arr = c.toArray();
        System.out.println(arr);    //[Ljava.lang.Object;@50cbc42f
        System.out.println(Arrays.deepToString(arr));   //[ab]

3、removeAll()和retainAll()

说明:二者结果相反

(1)removeAll():删除当前集合中与指定集合相同的元素

(2)retainAll():保留当前集合中与指定集合相同的元素,删除不相同的元素(取交集)

        Collection c = new ArrayList();
        c.add("abc");
        c.add("1");
        c.add("true");
        //对集合直接进行打印,会输出集合中所有元素,不会打印哈希值(是个字符串整体)
        System.out.println(c);  //[abc, 1, true]
        System.out.println(c.contains("1"));  //true
        c.remove("1");
        System.out.println(c);  //[abc, true]
        System.out.println(c.contains("1"));  //false
        Collection c1 = new ArrayList();
        c1.add("abc1");
        c1.add("abc2");
        c1.add("abc3");
        Collection c2 = new ArrayList();
        c2.add("abc2");
        c2.add("abc6");
        System.out.println(c1.containsAll(c2)); //false,全部包含的时候才为true
        /**
         * 下面注释每次只能打开一组
         */
        //重复的也添加进去
//        c1.addAll(c2);
//        System.out.println(c1);  //[abc1, abc2, abc3, abc2, abc6]
        //删除c1中与c2相同的元素
//        c1.removeAll(c2);
//        System.out.println(c1);  //[abc1, abc3],删除了“abc2”
        //取交集,和removeAll()相反
        c1.retainAll(c2);
        System.out.println(c1); //[abc2]

三、Iterator

1、interface Iterator<E>:迭代器,对所有Collection容器进行元素取出的公共接口,依赖子类实现(取出元素的方式)

2、迭代器的实现是通过内部类完成的:

(1)取出对象与容器相关联(在容器内部)

(2)取出对象直接访问容器内部的内容(因为每个容器的数据结构不同)

3、每个容器内部都有自己的取出方式,且取出方式都在容器内部,这意味着连取出对象的类型都在内部。为了建立每个容器内部统一的取出规则,对其进行了规则的定义(Iterator接口的hasNext()、next()方法)。至于如何判断,如何取出,是容器自己实现的,不需要知道每个容器的内部结构

好处:降低容器与取出方式之间的耦合性

所以,Collection中的 Iterator iterator() 方法需要子类实现

4、迭代器取代了Java Collections Framework中的Enumeration。迭代器与枚举有两点不同:

(1)迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的collection移除元素

(2)方法名称得到了改进

5、方法

(1)boolean hasNext():如果仍有元素可以迭代,则返回true

(2)E next():返回迭代的下一个元素(内有指针,每调用一次此方法,指针会自动后移)。如果没有下一个元素,抛出NoSuchElementException

(3)void remove():从迭代器指向的collection中移除迭代器返回的最后一个元素。每次调用next()只能调用一次此方法

        Collection c = new ArrayList();
        c.add("abc1");
        c.add("abc2");
        c.add("abc3");
        Iterator iterator = c.iterator();
        while (iterator.hasNext()){
            iterator.next();
        }
        System.out.println(c);  //[abc1, abc2, abc3]
        //iterator在while循环外依然可以使用,但不能再调用next()方法,因为指针已经到结尾处了
//        iterator.next();    //java.util.NoSuchElementException
        //从迭代器指向的集合c中移除迭代器返回的最后一个元素
        iterator.remove();
        //每次调用next()只能调用一次remove()
//        iterator.remove();    //java.lang.IllegalStateException
        System.out.println(c);  //[abc1, abc2]

注:迭代器的使用:先判断有没有可迭代的元素,再取出

6、迭代器两种用法的比较

        Collection c = new ArrayList();

        /**
         * while循环
         * 循环结束后,迭代器还可以使用(但不能再使用next()方法)
         */
        Iterator iterator = c.iterator();
        while (iterator.hasNext()){
            iterator.next();
        }

        /**
         * for循环 -- 开发时常用
         * while循环中,iterator在循环外依旧可以使用,占用内存
         */
        for (Iterator it = c.iterator(); it.hasNext(); ){
            it.next();
        }

7、Iterator iterator():取出元素的方式 -- 迭代器

(1)该对象必须依赖于具体的容器,因为每个容器的数据结构不同

(2)该迭代器对象是在容器中进行内部实现的

(3)对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可,也就是iterator()方法

也就是说,Iterator接口就是对所有的Collection容器进行元素取出的公共接口

四、Java中集合类的关系图

猜你喜欢

转载自blog.csdn.net/ruyu00/article/details/81836293