1、集合的概述

1.1定义:

为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他的数据,所有的集合类都位于java.util包下。

1.2集合与数组的区别:

数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象。

1.3集合的组成:

Java集合类主要是由两个接口派生而出的:CollectionMap,它们两是Java集合框架的跟接口,这两个接口又包含了一些子接口或实现类,其中所有的Map实现类用于保存具有映射关系的数据,如图:






根据上图,可以把Java所有集合分成三大类:

Set:无序、不可重复

List:像一个数组,可以记住每次添加元素的顺序、且List的长度可变。访问`List集合中的元素,可以直接根据元素的索引来访问。





2、CollectionIterator接口

1、CollectionListSetQueue接口的父接口

2、Collection实现类都重写了toString()方法:
当使用System.outprintln()方法来输出集合对象时,将输出[elel,ele2…]的形式

3、使用Java8增强的Iterator接口遍历集合元素
Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样:Collection系列集合、Map系列集合主要用于盛装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象也破称为迭代器。

Iterator接口隐藏了各种Collection实现类的底层细节,向应用程序提供了遍历Collection集合元素的统一编程接口。Iterator接口里定义了如下4个方法。

boolean hasNext():如果被迭代的集合元素还没有被遍历完,则返回true

Object next():返回集合里的下一个元素。

void`` remove():删除集合里上一次next方法返回的元素。

void forEachRemaining(Consumer action):这是Java8为Iterator新增的默认方法,该方法可使用Lambda表达式来遍历集合元素。

利用Iterator 来遍历集合,代码示例:

public class IteratorTest
{
    public static void main(String[] args)
    {
        // 创建集合、添加元素的代码与前一个程序相同
        Collection books = new HashSet();
        books.add("轻量级Java EE企业应用实战");
        books.add("疯狂Java讲义");
        books.add("疯狂Android讲义");
        // 获取books集合对应的迭代器
        Iterator it = books.iterator();
        while(it.hasNext())
        {
            // it.next()方法返回的数据类型是Object类型,因此需要强制类型转换
            String book = (String)it.next();
            System.out.println(book);
            if (book.equals("疯狂Java讲义"))
            {
                // 从集合中删除上一次next方法返回的元素
                it.remove();
            }
            // 对book变量赋值,不会改变集合元素本身
            book = "测试字符串";   //①
        }
        System.out.println(books);
    }
}

tisp:

Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象。Iterator提供了两个方法来迭代访问Collection集合里的元素,并可通过remove()方法来删除集合中上一次next()方法返回的集合元素。


4、Iterator遍历集合时,是把集合元素的值传给了迭代变量,并不是把集合元素的本身传给了迭代变量。

5、用Iterator迭代访问集合元素时,Collection集合里的元素不能被改变,从而可以避免共享资源而引发的潜在问题。

当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iteratorremove()方法删除上一次next()方法返回的集合元素才可以;否则将会引发java.util.ConcurrentModificationException异常。

6、使用foreach循环遍历集合元素

  • foreach循环遍历时,也只是把集合元素的只符给了迭代变量,而不是集合元素本身。
  • 当使用foreach循环迭代访问集合元素时,该集合也不能被改变,否则也会报错。

7、使用Java8新增的Predicate操作集合

涉及到就是removeIf(Predicate filter)方法,该方法会删除符合filter条件的所有元素。

代码示例:

public class PredicateTest
{
    public static void main(String[] args)
    {
        // 创建一个集合
        Collection books = new HashSet();
        books.add(new String("轻量级Java EE企业应用实战"));
        books.add(new String("疯狂Java讲义"));
        books.add(new String("疯狂iOS讲义"));
        books.add(new String("疯狂Ajax讲义"));
        books.add(new String("疯狂Android讲义"));

        // 使用Lambda表达式(目标类型是Predicate)过滤集合 删除长度小于10的字符串
        books.removeIf(ele -> ((String)ele).length() < 10);
        System.out.println(books);
    }
}