Java学习日志(三): Colletion接口,迭代器Iterator接口,增强for循环

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

今天学习了Colletion接口(集合),迭代器,增强for循环

Collection接口(集合)

java.util包中

集合与数组的区别

数组:

  • 长度固定 new int[3]{1,2,3,4}
  • 可以存储基本类型数据,int[] double[]
  • 可以存储引用类型的数据, Person[]

集合:

  • 长度可以变化 add()长度+1 remove()长度-1
  • 只能存储引用类型的数据 ArrayList ArrayList

继承与实现关系

在这里插入图片描述

Collection常用方法

  • public boolean add(E e) : 把给定的对象添加到当前集合中 。
  • public void clear() :清空集合中所有的元素。
  • public boolean remove(E e) : 把给定的对象在当前集合中删除。
  • public boolean contains(Object obj) : 判断当前集合中是否包含给定的对象。
  • public boolean isEmpty() : 判断当前集合是否为空。
  • public int size() : 返回集合中元素的个数。
  • public Object[] toArray() : 把集合中的元素,存储到数组中
import java.util.ArrayList;
import java.util.Collection;

public class Demo01 {
    public static void main(String[] args) {
        //多态
        Collection<String> coll = new ArrayList<>();
        coll.add("张三");
        coll.add("李四");
        coll.add("aaa");
        coll.add("张三");
        coll.add("ccc");
        //集合重写了toString方法
        System.out.println(coll);

        /*
         *   public boolean remove(E e) : 把给定的对象在当前集合中删除。
         *       如果集合中有对应的元素,移除元素,返回true
         *       没有的话,不会对集合产生影响,返回false
         *       如果有多个元素,只移除第一个
         * */
        boolean b1 = coll.remove("张三");
        System.out.println(b1);
        boolean b2 = coll.remove("张aaa");
        System.out.println(b2);
        System.out.println(coll);

        /*
         * public boolean contains(Object obj) : 判断当前集合中是否包含给定的对象。
         *   包含返回true
         *   不包含返回false
         * */
        boolean b3 = coll.contains("aaa");
        System.out.println(b3);
        boolean b4 = coll.contains("aaaa");
        System.out.println(b4);

        /*
        * public int size() : 返回集合中元素的个数。
        * */
        System.out.println(coll.size());//4

        /*
        * public Object[] toArray() : 把集合中的元素,存储到数组中
        * */
        Object[] arr = coll.toArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        /*
        * public boolean isEmpty() : 判断当前集合是否为空。
        *   集合为空,返回true
        *   集合不为空,返回false
        * */
        System.out.println(coll.isEmpty());//false
        /*
        * public void clear() :清空集合中所有的元素。
        *   集合还存在,元素被清空
        * */
        coll.clear();
        System.out.println(coll);//[]
        System.out.println(coll.isEmpty());//true
    }
}

Iterator接口(迭代器)

java.util.Iterator

迭代器

由来:

  • 集合有很多种,每种集合存储数据的原理不同,取出元素的方式也不同,
    所以我们可以使用迭代器,来取出元素,是一种通用的取出集合中元素的方式.

原理::

  • 即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个 元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代

迭代器的使用:

扫描二维码关注公众号,回复: 9027598 查看本文章
  • Collection集合中有一个方法 iterator(),返回了Iterator接口的实现类对象Iterator iterator() 返回此集合中元素的迭代器。

了解:迭代器的实现类是每个集合的内部类

hasNext()与next()

成员方法:

  • boolean hasNext() 如果迭代具有更多元素,则返回 true 。
  • E next() 返回迭代中的下一个元素。

使用步骤

迭代器的使用步骤:

  1. 创建集合对象,在集合中添加元素
  2. 使用集合的方法iterator获取迭代器的对象
  3. 使用迭代器Iterator中的方法hasNext和next依次取出集合中的元素

注意:若集合中已经没有元素,继续迭代,会报NoSuchElementException异常

public class Demo02Interator {
    public static void main(String[] args) {
//        1.创建集合对象,在集合中添加元素
        Collection<String> coll = new ArrayList<>();
        coll.add("aaa");
        coll.add("bbb");
        coll.add("ccc");
        coll.add("ddd");
        coll.add("eee");

/*
*         2.使用集合的方法iterator获取迭代器的对象
*         迭代器的泛型跟着集合走
* */
        Iterator<String> it = coll.iterator();
//        3.使用迭代器Iterator中的方法hasNext和next依次取出集合中的元素
        /*boolean b = it.hasNext();
        System.out.println(b);//true
        String s = it.next();
        System.out.println(s); //aaa

        b = it.hasNext();
        System.out.println(b);//true
        s = it.next();
        System.out.println(s);//bbb

        b = it.hasNext();
        System.out.println(b);//true
        s = it.next();
        System.out.println(s);//ccc

        b = it.hasNext();
        System.out.println(b);//true
        s = it.next();
        System.out.println(s);//ddd

        b = it.hasNext();
        System.out.println(b);//false
        s = it.next();
        System.out.println(s);//eee

        b = it.hasNext();
        System.out.println(b);//没有元素,再取出NoSuchElementException
        s = it.next();
        System.out.println(s);*/

        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);
        }

    }
}

并发修改异常

ConcurrentModificationException
产生的原因:在使用迭代器遍历集合的过程中,对集合的长度进行了修改(增加或删除元素)
并发:遍历和修改同时进行
在这里插入图片描述
解决方法:

  1. 不对集合进行修改
  2. 想要修改,可以使用Iterator接口的子接口ListIterator
public interface ListIterator<E> extends Iterator<E>{
//里面定义了往集合中添加元素和删除元素的方法
 	void add​(E e){} //将指定的元素插入列表(可选操作)。
      	void remove(){} //从列表中删除 next()或 previous() (可选操作)返回的最后一个元素。

}

注意:ListIterator接口只能遍历list接口下边的集合

public class Demo03 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        list.add("eee");
//        获取迭代器对象
        Iterator<String> it = list.iterator();
//        取出元素
        while(it.hasNext()){
            String s = it.next();
            System.out.println(s);
            /*
            * 增加一个判断,如果存在aaa,就增加hhh
            *
            * */
            /*if(s.equals("aaa")){
                list.add("hhh");	//ConcurrentModificationException
            }*/
//            list.remove(s);	//ConcurrentModificationException
        }
        System.out.println("---------------------");
        //        使用ListIterator方法获取迭代器对象
        ListIterator<String> lit = list.listIterator();
        while(lit.hasNext()){
            String s = lit.next();
            System.out.println(s);
            if(s.equals("aaa")){
                lit.add("hhh");//使用迭代器增加元素的方法
            }
        }
        System.out.println(list);
    }
}

增强for循环

JDK1.5之后出现的新特性,底层就是一个迭代器,使用for循环的格式简化了迭代器的代码
作用:只要遍历都用增强for!!!

  1. 可以遍历数组
  2. 可以遍历集合

格式:

for(集合/数组中的元素数据类型 变量名:集合名/数组名){
	sout(变量名);
}

使用增强for遍历数组

private static void show01() {
    int[] arr = {1, 2, 3};
    for (int a : arr) {
        System.out.println(a);
    }
}

增强for循环遍历的同时,可以使用元素特有的方法

/*
 * 增强for循环遍历的同时,可以使用元素特有的方法
 * */
private static void show03() {
    String[] arr = {"111", "222", "333"};
    for (String s : arr) {
        System.out.println(s.length());
    }
}

增强for遍历集合

private static void show04() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(null);//用int可能会报空指针异常
        list.add(3);
        list.add(4);
//        for (int i : list) {//自动拆箱,用int可能会报空指针异常
//            System.out.println(i);
//        }
        for (Integer in : list) {
            System.out.println(in);
        }
    }

增强for和普通for的区别

普通for:在遍历的过程中可以对数组或集合中的元素进行修改(索引修改)
增强for:没有索引,不能修改数组或集合中的元素
原理:在这里插入图片描述

private static void show02() {
    int[] arr1 = {1, 2, 3};
    //普通for
    for (int i = 0; i < arr1.length; i++) {
        //把数组中的元素扩大二倍
        arr1[i] *= 2;//扩大的是数组的值
        System.out.println(arr1[i]);
    }
    //修改了
    System.out.println("arr1[0]" + arr1[0]);
    System.out.println("-------------------");
    int[] arr2 = {1, 2, 3};
    //增强for     ---->arr2.for 快捷键
    for (int i : arr2) {
        //把数组中的元素扩大二倍
        i *= 2;//扩大的是i的值,原数组没变
        System.out.println(i);
    }
    //没有被修改!!!!!!!!!!!!!!!!!
    System.out.println("arr2[0]" + arr2[0]);
}
发布了14 篇原创文章 · 获赞 15 · 访问量 1627

猜你喜欢

转载自blog.csdn.net/Sakuraaaaaaa/article/details/104124065