zoukankan      html  css  js  c++  java
  • 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));
        }
    
    }
  • 相关阅读:
    统一身份认证(CAS)客户端测试获取信息代码
    常用的java工具类
    windows 批处理(bat)中执行程序后不等待直接退出(cmd中新进程执行程序)
    持续交付的八条原则,你能做到几条?(转)
    灵动标签调用栏目导航技巧
    .net网络编程(2)网络适配器
    Property Value Inheritance Tip(1)
    排序算法补充
    编码参考(Encoding)
    .net网络编程(3)Socket基础
  • 原文地址:https://www.cnblogs.com/leoliu168/p/9906710.html
Copyright © 2011-2022 走看看