Java集合概述必知必会

一、Java集合概述

为了保存数量不确定的数据,以及保存具有映射关系的数据,Java提供了集合类,集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。所有的集合类都位于java.util包下,后来为了处理多线程环境下的并发安全问题,Java5还在java.util.concurrent包下提供了一些多线程支持的集合类。
集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量);而集合里只能保存对象(对象的引用变量)。
Java的集合主要有两个接口派生而出:Collection和Map。这两个是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。
在这里插入图片描述
如图是Map体系的继承树,所有的Map实现类用于保存具有映射关系的数据。
在这里插入图片描述

二、Collection和Iterator接口

Collection接口是Set、List、Queue接口的父接口,故该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集合。当使用System.out的println()方法来输出集合对象时,将输出[el1, el2, …]的形式,这是因为所有的Collection实现类都重写了toString()方法,该方法可以一次性的地输出集合中的所有元素。
如果想一次访问集合里的每一个元素,则需要对集合元素进行遍历,下面介绍遍历集合元素的方法:
1.使用Lambda表达式来遍历集合:

public class MainTest {
    public static void main(String[] args) {
        Collection collection = new HashSet();
        collection.add("你大爷");
        collection.add("你爸爸");
        collection.add("你奶奶");
        collection.forEach(obj -> System.out.println("迭代集合元素:" + obj));
    }
}
输出结果:
迭代集合元素:你大爷
迭代集合元素:你奶奶
迭代集合元素:你爸爸

上面的程序调用了Iterable的的forEach()默认方法来遍历集合元素,传给该方法的参数是一个Lambda表达式。forEach()放啊发会自动将集合元素逐个传给Lambda表达式的形参,这样Lambda表达式的代码体即可遍历到集合元素了。
2.使用Java8增强的Iterator遍历集合元素:
Iterator也是Java集合框架的成员,但它与Collection、Map系列的集合不一样:这两个集合主要用于盛装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,故Iterator对象也被称为迭代器。
在Iterator接口里定义了如下4种方法:

boolean hasNext(): 如果被迭代的集合元素还没有被遍历完,则返回true。
Object next(): 返回集合里的下一个元素。
void remove(): 删除集合里上一次next方法返回的元素。
void forEachRemaining(Consumer action): 这是Java8为Iterator新增的默认方法,该方法可用Lambda表达式来遍历集合元素。

public class MainTest {
    public static void main(String[] args) {
        Collection collection = new HashSet();
        collection.add("你大爷");
        collection.add("你爸爸");
        collection.add("你奶奶");
        Iterator iterator = collection.iterator();
        while(iterator.hasNext()){
            String book = (String)iterator.next();
            System.out.println(book);
            if(book.equals("你大爷")){
                //从集合中删除上一次next()方法返回的元素。
                iterator.remove();
            }
        }
        System.out.println(collection);
    }
}
输出结果:
你大爷
你奶奶
你爸爸
[你奶奶, 你爸爸]

Iterator必须依附于Collection对象,若有一个Iterator对象,则必然有一个与之关联的Collection对象。当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身本有任何影响。
当使用Iterator迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove()方法删除上一次next()方法返回的集合元素才可以,否则将会引发java.util.ConcurrentModificationException异常:

public class MainTest {
    public static void main(String[] args) {
        Collection collection = new HashSet();
        collection.add("你大爷");
        collection.add("你爸爸");
        collection.add("你奶奶");
        Iterator iterator = collection.iterator();
        while(iterator.hasNext()){
            String book = (String)iterator.next();
            System.out.println(book);
            if(book.equals("你大爷")){
                //使用集合对象来操作:
                collection.remove("你大爷");
            }
        }
        System.out.println(collection);
    }
}

Iterator迭代器采用的是快速失败(fail-fast)机制,一旦在迭代过程中检测到该集合已经被修改(通常是程序中的其他线程修改),程序会立即引发ConcurrentModificationException异常。
3.使用foreach循环遍历集合元素:

public class MainTest {
    public static void main(String[] args) {
        Collection collection = new HashSet();
        collection.add("你大爷");
        collection.add("你爸爸");
        collection.add("你奶奶");
        for(Object obj : collection){
            String book = (String)obj;
            System.out.println(book);
            if(book.equals("你大爷")){
                //这样同样会引发ConcurrentModificationException异常。
                collection.remove("你大爷");
            }
        }
    }
}

值得一提的是,这种foreach循环遍历与Iterator遍历集合有异曲同工之处就是都不允许在遍历的时候,该集合不能改变。foreach循环中的迭代变量也不是集合元素本身,系统只是依次把集合元素的值赋给迭代变量。


使用Java8新增的Predicate操作集合:
Java8起为Collection集合新增了一个removeIf(Predicate filter)方法,该方法可以批量删除符合filter条件的所有元素,该方法需要一个Predicate(谓词)对象作为参数,Predicate也是函数式接口,故可以用Lambda表达式作为参数。

public class MainTest {
    public static void main(String[] args) {
        Collection collection = new HashSet();
        collection.add("你大爷你大爷你大爷你大爷");
        collection.add("你爸爸你爸爸你爸爸");
        collection.add("你奶奶你奶奶");
        collection.add("你母亲");
        collection.removeIf(ele -> ((String)ele).length() > 6);
        System.out.println(collection);
    }
}
输出结果:
[你母亲, 你奶奶你奶奶]

猜你喜欢

转载自blog.csdn.net/laobanhuanghe/article/details/101027772
今日推荐