Java容器深入浅出之Collection与Iterator接口

Java中用于保存对象的容器,除了数组,就是Collection和Map接口下的容器实现类了,包括用于迭代容器中对象的Iterator接口,构成了Java数据结构主体的集合体系。其中包括:

1. Collection:包括Set、List和Queue;主要的实现类有HashSet、TreeSet、ArrayList、LinkedList和ArrayDeque

2. Map:主要的实现类为HashMap、TreeMap

3. Iterator: 用于遍历集合中的对象

Collection

Collection接口中定义了Set、List和Queue都会用到的方法,包括:

1. 增

boolean add(Object o)

boolean addAll(Collection c)

2. 删

boolean remove(Object o): 删除对象o,只删除第一个符合的对象,成功返回true

boolean removeAll(Collection c):删除集合c包含的所有元素,

boolean removeIf(Predicate<? super E> filter):Java8增强的条件查询,传入函数式Predicate对象filter进行条件删除

boolean retainAll(Collection c):删除c中不包含的元素,相当于取交集

void clear():清除所有元素,长度归0

3. 查

int size()

boolean isEmpty()

boolean contains(Object o):是否包含元素o

boolean containsAll(Collection c):是否包含集合c的所有元素

4. 改

Object toArray():集合变为数组

5. 其它

Iterator iterator():返回一个Iterator对象,用于遍历集合元素

Iterator

Iterator是Java集合的接口成员,提供遍历集合对象的方法。定义了如下4个方法:

1. boolean hasNext():判断是否遍历完成

2. Object next():返回下一个元素

3. void remove():删除上一次next返回的元素

4. void forEachRemaining(Consumer action):Java8新增的Lambda遍历方法

要注意的是:

1. Iterator对象通过集合调用Iterator方法生成。

2. Iterator遍历集合元素时(包括增强for循环),是通过值传递来获取元素的值,因此在迭代中修改元素的值将不起作用。

3. Iterator只能通过自身的remove方法删除对象,而不能调用集合自身的remove方法,否则会导致ConcurrentModificationException异常。

4. Iterator对象的遍历方法,无论是常规的while循环,还是Java8新增的forEachRemaining方法,只能在一个方法中遍历一次集合。(原因在于底层都是通过Next来返回集合元素,在第一轮中已经Next完集合所有元素了,所以再起一轮遍历,hasNext将为false;相反,集合的forEach方法,则可以多轮遍历)

public class IteratorTest {

    public static void main(String[] args) {
        
        Set<String> books = new HashSet<String>();
        books.add("1844年经济学哲学手稿");
        books.add("德谟克利特的自然哲学和伊壁鸠鲁的自然哲学的差别");
        books.add("资本论");
        books.add("自然辩证法");
        books.add("1");
        //Java8的增强条件删除,需要传入函数式条件
        books.removeIf(ele -> ele.length() < 3);
        
        Iterator<String> it = books.iterator();
        //使用Lambda表达式遍历集合(Iterator对象)
        //it.forEachRemaining(obj -> System.out.println("Iterator遍历对象:" + obj));
        
        while(it.hasNext()) {
            String book = it.next();
            System.out.println(book);
            if(book.equals("资本论")) {
                it.remove();
            }
            book = "通往奴役之路";//Iterator不能改变集合元素,赋值失败
        }
        
        System.out.println(books);

        
        //使用Lambda表达式遍历集合(集合对象)
        books.forEach(obj -> System.out.println("集合遍历对象:" + obj));
    }

}

猜你喜欢

转载自www.cnblogs.com/leoliu168/p/9906710.html