Collection接口
Java集合
Java分为单列数据集合和双列数据集合
- 单列数据集合 一次存取一个元素
 - 双列数据集合 一次存取一对元素
 
单列数据集合
单列集合的祖宗(Collection)

- List系列集合:有序(按照添加的顺序存放)、可重复、有索引
 - Set系列集合:无序、不可重复、无索引
 
Collection接口
方法

其中ArrayList继承Collection接口实现的contains方法是利用equals挨个遍历比对实现的。如果集合中存储的是自定义对象,也想通过contains方法来判断是否包含在集合中,那么该元素对象一定要重写equals方法

Collection的通用的遍历方式
普通for是通过索引进行访问的,但是Set是无索引的,所以普通for遍历并不是一种通用的遍历方式
- 迭代器遍历
 

    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("aaa");
        collection.add("bbb");
        collection.add("ccc");
        final Iterator<String> iterator = collection.iterator();
        while(iterator.hasNext()){
            //next在底层做两件事情,获取元素和移动指针
            String str = iterator.next();
            System.out.println(str);
        }
    }
迭代器细节
- 报错NoSuchElementException
 - 迭代器遍历完毕,指针不会复位
 - 循环中只能用一次next方法
 - 迭代器遍历时,不能用集合的方法进行增加或删除
 
- 增强for遍历
 
增强for的底层就是迭代器,为了简化迭代器写的
它是JDK5之后出现的,其内部原理就是一个Iterator迭代器
所有的单列集合和数组才能用增强for循环遍历,因为单列集合Collection实现了Iterator接口
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("aaa");
        collection.add("bbb");
        collection.add("ccc");
        for (String s : collection) {
            System.out.println(s);
        }
    }
- Lambda表达式遍历
ArrayList的forEach方法的参数是一个Consumer类,它是一个函数式接口 
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("aaa");
        collection.add("bbb");
        collection.add("ccc");
        //匿名内部类
        collection.forEach(new Consumer<String>() {
            /**
             * @param s 依次表示集合中的每一个数据
             */
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
    }
这里用到了匿名内部类,匿名内部类就是当一个抽象类或接口有一个或者几个抽象方法,不想去继承或者实现它重新定义,就可以用匿名内部类的方法new一个抽象类或者接口直接重写抽象方法。
    public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("aaa");
        collection.add("bbb");
        collection.add("ccc");
        //使用Lambda表达式简化匿名内部类
        collection.forEach(s->System.out.println(s));
        //也可以给Lambda表达式传递方法引用
        collection.forEach(System.out::println);
    }
}
                    
                
                
            
        
浙公网安备 33010602011771号