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);
    }
}
posted @ 2024-03-05 21:49  破忒头头  阅读(25)  评论(0)    收藏  举报