Java中的小知识 ----- 集合(二)

集合中的迭代器

通过集合对象获取对应的Iterator<E>迭代器

Iterator<E> iterator();
常用方法:
    boolean hasNext();
        判断当前Iterator是否可以继续运行
    E next();
        获取Itreator当前指向元素,并且指向下一个元素
    void remove();
        删除
        【注意】:
            1.remove方法有且只能删除通next方法获取的元素
            2.remove方法如果想要使用,必须紧挨着next方法
package com.wcc.b.iterator;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * @Author kk
 * @Date 2020/3/16 9:48
 */
public class Demo1 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<String>();

        c.add("烤羊排");
        c.add("油闷大虾");
        c.add("土豆牛肉");
        c.add("麻辣香锅");
        c.add("孜然肉片");
        c.add("酸汤肥牛");

        /*
            获取当前集合对应的Iterator迭代器对象
         */
        Iterator<String> iterator = c.iterator();

        System.out.println("当前集合是否可以正常运行:" + iterator.hasNext());
        System.out.println("获取当前指向的元素:" + iterator.next());
        System.out.println("获取当前指向的元素:" + iterator.next());
        /*
            执行结果:
                获取当前指向的元素:烤羊排
                获取当前指向的元素:油闷大虾
         */
        iterator.remove();
        //因为离着remove最近的next指向的是油闷大虾,所以删除了油闷大虾
        System.out.println(c);
        iterator.remove();
        System.out.println(c);
        /*
            [烤羊排, 土豆牛肉, 麻辣香锅, 孜然肉片, 酸汤肥牛]
            Exception in thread "main" java.lang.IllegalStateException
	            at java.base/java.util.ArrayList$Itr.remove(ArrayList.java:1009)
	            at com.wcc.b.iterator.Demo1.main(Demo1.java:37)

         */
    }
}
package com.wcc.b.iterator;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * @Author kk
 * @Date 2020/3/16 10:03
 */
public class Demo2 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<String>();

        c.add("烤羊排");
        c.add("油闷大虾");
        c.add("土豆牛肉");
        c.add("麻辣香锅");
        c.add("孜然肉片");
        c.add("酸汤肥牛");

        Iterator<String> iterator = c.iterator();

        while (iterator.hasNext()){
            System.out.println(iterator.next());

            //通过集合删除元素
            c.remove("土豆牛肉");
            /**
             * Exception in thread "main" java.util.ConcurrentModificationException
             * 	at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1042)
             * 	at java.base/java.util.ArrayList$Itr.next(ArrayList.java:996)
             * 	at com.wcc.b.iterator.Demo2.main(Demo2.java:25)
             *
             * 	Iterator在创建的过程中,会同集合中的每个元素打招呼,记录每一个元素的位置
             * 	在Iterator执行next方法过程中,会按照初始的条件一个一个遍历,但是当集合中删除某个已经被
             * 	迭代器记录的元素时,迭代器会因为找不到元素而发生异常
             *
             * 	这里是因为集合中的元素,对于集合本身和当前Iterator而言是一个共享资源
             * 	不管是哪一方操作元素,都存在影响对方的情况【共享资源冲突问题】
             */

        }
    }
}

List<E>集合接口特征和方法

特征:有序,可重复

有序:添加顺序和存储顺序一致

可重复:相同元素可以同时添加

List<E>接口下的实现类,存在一定的下标操作机制

ArrayList<E> 底层数组形式操作,可以通过下标直接访问

LinkedList<E>底层是一个双向链表接口,下标等价于计数器

特定的方法:

增:
    add(E e);
        在List接口下,当前方法是添加元素到集合的末尾,尾插法
    addAll(Collection<? extends E> c);
        List接口下,当前方法是添加另一个集合到当前集合的末尾,要求添加的集合中
        保存的元素和当前集合保存元素一致,或者说是当前集合保存的元素的子类
    add(int index, E e);
        在指定的下标位置,添加指定元素
    add(int index, Collection<? extends E> c);
       与上一个addAll方法一致
删:
    void clear();
        清空整个集合
    remove(Object obj);
        删除集合中的指定元素
    removeAll(Collection<?> c);
        删除两个集合的交集
    retainall(Collection<?> c);
        保留两个集合的交集
    E remove(int index);
        删除指定下标的元素,返回值是被删除的元素

改:
    E set(int index, E e);
        使用指定元素替换指定下标index的元素,返回值是被替换的元素

查:
    int size();
        有效元素个数
    boolean isEmpty();
        判断当前集合是否为空
    boolean contains(Object obj);
        判断该集合中是否有某个元素
    boolean containsAll(Collection<?> c);
        判断c集合是不是该集合的子集
    int indexOf(Object obj);
        查询指定元素所在的下标位置
    int lastIndexOf(Object obj);
        查询指定元素最后一次出现的位置
    E get(int index);
        获取指定下标的元素
    List<E> subList(int fromIndex, int endIndex);
        获取当前集合的子集合
        

方法演示代码:

package com.wcc.c.List;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author kk
 * @Date 2020/3/16 11:18
 */
public class Demo1 {
    public static void main(String[] args) {
        //List接口没有对象,所以用实现类ArrayList
        List<String> list = new ArrayList<String>();

        list.add("酱油炒饭");
        list.add("酱爆牛肉");
        list.add("扬州炒饭");
        list.add("黄金炒饭");
        list.add("老干妈炒饭");

        System.out.println(list);
        list.add(3,"鱼香肉丝炒饭");
        System.out.println(list);

        List<String> list2 = new ArrayList<String>();

        list2.add("干炒牛河");
        list2.add("炒方便面");
        list2.add("炒饼丝");
        list2.add("干炒牛河");
        list.addAll(list2);
        System.out.println(list);
        //[酱油炒饭, 酱爆牛肉, 扬州炒饭, 鱼香肉丝炒饭, 黄金炒饭,
        // 老干妈炒饭, 干炒牛河, 炒方便面, 炒饼丝, 肉火烧]

        System.out.println(list.remove(5));
        //老干妈炒饭
        list.set(4,"我是饭");
        System.out.println(list);
        //[酱油炒饭, 酱爆牛肉, 扬州炒饭, 鱼香肉丝炒饭, 我是饭, 干炒牛河, 炒方便面, 炒饼丝, 肉火烧]
        System.out.println(list.indexOf("干炒牛河"));
        //5
        System.out.println(list.lastIndexOf("干炒牛河"));
        //8

        List<String> list3 = list.subList(0,5);
        //subList方法要头不要尾
        System.out.println(list3);
        //[酱油炒饭, 酱爆牛肉, 扬州炒饭, 鱼香肉丝炒饭, 我是饭]
    }
}

未完待续......

发布了26 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42597414/article/details/104892253