Java集合

Java集合概述

为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。

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

Java的集合类主要由两个接口派生而出:CollectionMap,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类。

三种集合示意图

在这里插入图片描述
我们可以把Java的所有集合分为三大类,其中Set集合类似于一个罐子,把一个对象添加到Set集合时,Set集合无法记住添加这个元素的顺序,所以Set里的元素不能重复(否则系统无法准确识别这个元素);List集合非常像一个数组,它可以记住每次添加元素的顺序,只是List的长度可变。Map集合也像一个罐子,只是它里面的每项数据都由两个值组成。

Collection和Iterator接口

Collection接口是List、Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集合。Collection接口里定义了如下操作集合元素的方法。

//该方法用于向集合里添加一个元素。
//如果集合对象被添加操作改变了,则返回true
boolean add(E e);
//该方法把集合c里的所有元素添加到指定集合里。
//如果集合对象被添加操作改变了,则返回true
boolean addAll(Collection<? extends E> c);
//清除集合里的所有元素,将集合长度变为0
void clear();
//返回集合里是否包含指定元素
boolean contains(Object o);
//返回集合里是否包含集合c里的所有元素
boolean containsAll(Collection<?> c);
//返回集合是否为空。
//当集合长度为0时返回true,否则返回false
boolean isEmpty();
//返回一个Iterator对象,用于遍历集合里的元素
Iterator<E> iterator();
//删除集合中的指定元素o,当集合中包含了一个或多个元素o时,这些元素将被删除
//该方法返回true
boolean remove(Object o);
//从集合中删除集合c里包含的所有元素(相当于用调用该方法的集合减集合c)
//如果删除了一个或一个以上的元素,则该方法返回true
boolean removeAll(Collection<?> c);
//从集合中删除集合c里不包含的元素(相当于把调用该方法的集合变成该集合和集合c的交集)
//如果该操作改变了调用该方法的集合,则该方法返回true
boolean retainAll(Collection<?> c);
//该方法返回集合里元素的个数
int size();
//该方法把集合转换成一个数组,所有的集合元素变成对应的数组元素
Object[] toArray();

如果想了解更多方法,请自行查阅API文档

使用Iterator接口遍历集合元素

Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样:Collection系列集合、Map系列集合主要用于盛装其他对象,而Iterator则主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。
Iterator接口里定义了如下三个方法

//如果被迭代的集合元素还没有被遍历,则返回true
boolean hasNext();
//返回集合里的下一个元素
E next();
//删除集合里上一次next方法返回的元素
 default void remove() {
     throw new UnsupportedOperationException("remove");
 }

Iterator仅用于遍历集合,Iterator本身并不提供盛装对象的能力。如果需要创建Iterator对象,则必须有一个被迭代的集合。没有集合的Iterator仿佛无本之木,没有存在的价值。

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

比如HashMap的迭代器KeyIterator 就依附于HashMap类中

    final class KeyIterator extends HashIterator
        implements Iterator<K> {
        public final K next() { return nextNode().key; }
    }

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

public class IteratorTest {

    public static void main(String[] args) {
        Collection books = new HashSet();
        books.add("轻量级Java EE企业应用内实战");
        books.add("疯狂Java讲义");
        books.add("疯狂Android讲义");
        Iterator it = books.iterator();
        while (it.hasNext()){
            String book = (String) it.next();
            System.out.println(book);
            if (book.equals("疯狂Android讲义")){
                //从集合中删除上一次next方法返回的元素
                //it.remove();
                books.remove(book);

            }

        }
        System.out.println(books);


    }

}
Exception in thread "main" java.util.ConcurrentModificationException
疯狂Android讲义
	at java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
	at java.util.HashMap$KeyIterator.next(HashMap.java:1469)
	at com.sunrise.eHealth.day0610.IteratorTest.main(IteratorTest.java:16)
使用foreach循环遍历集合元素

除了可以使用Iterator接口迭代访问Collection集合里的元素之外,使用Java5提供的foreach循环迭代访问集合元素更加便捷。

        Collection books = new HashSet();
        books.add(new String("轻量级Java EE企业应用内实战"));
        books.add(new String("疯狂Java讲义"));
        books.add(new String("疯狂Android讲义"));

        for (Object obj : books){
            System.out.println(obj);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值