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

集合中的迭代器

Collection接口继承了Iterable,Collection通过调用Iterator方法来得到迭代器,通过迭代器的方法来完成集合中元素的遍历迭代。

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迭代器对象
         */
        //Collection接口继承了Iterable,Collection通过调用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);
        //[酱油炒饭, 酱爆牛肉, 扬州炒饭, 鱼香肉丝炒饭, 我是饭]
    }
}

未完待续......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值