Java关于Collection集合、iterator迭代器、增强for循环、泛型的回顾

Collection、List、泛型、数据结构

1.集合和数组的区别

数组:
1.引用类型
2.可以存储多个元素
3.数组的长度是固定的 int[] arr1 = new int[10]; int[] arr2 = {1, 2, 3};
4.数组既可以存储基本数据类型又可存储引用数据类型。
int[], double[], String[], Student[]
集合:
1.引用数据类型
2.可存储多个元素
3.集合的存储长度是可变化的
4.只能存储引用数据类型

ArrayList<int> (x) 错误
ArrayList<Integer> ()正确
ArrayList<Student> ()正确

2.集合常用类的继承体系
在这里插入图片描述
3.Collection常用功能(重点)


```java
/*
    java.util.Collection:接口
        Collection 层次结构 中的根接口。
        Collection 表示一组对象,这些对象也称为 collection 的元素。
        一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
    Collection接口中定义了所有单列集合中共性的成员方法,所有的单列集合都可以使用
        public boolean add(E e) : 把给定的对象添加到当前集合中 。
        public boolean remove(E e) : 把给定的对象在当前集合中删除。
        public boolean contains(Object obj) : 判断当前集合中是否包含给定的对象。
        public boolean isEmpty() : 判断当前集合是否为空。
        public int size() : 返回集合中元素的个数。
        public Object[] toArray() : 把集合中的元素,存储到数组中
        public void clear() :清空集合中所有的元素。
 */
 public class Demo01Collection{
  public static void main(String[] args){
   //创建Collection集合对象:多态扩展性强
   //Collection<String> coll = new ArrayList<>();
   Collection<String> coll = new HashSet<>();
    /*
            public boolean add(E e) 往集合中添加元素
            返回值:boolean
                添加成功,返回true,添加元素百分之百都会成功
                添加失败,返回false
         */
         boolean b1 = coll.add("张三");
         System.out.println("b1"+b1);
         coll.add("李四");
		 coll.add("王五");
         coll.add("张三");
         coll.add("赵六");
         coll.add("田七");
         System.out.println(coll);//[张三, 李四, 王五, 张三, 赵六, 田七]  打印对象名,不是地址,重写了toString方法
          /*
            public boolean remove(E e) 移除集合中指定的元素
            返回值:boolean
                集合中存在指定的元素,移除元素,返回true;如果集合中有相同的元素,只会移除第一个
                集合中不存在指定的元素,对集合没有影响,返回false
         */
        boolean b2 = coll.remove("张三");
         System.out.println("b2:"+b2);//b2:true
        System.out.println(coll);//[李四, 王五, 张三, 赵六, 田七]
        
        boolean b3 = coll.remove("尼古拉斯.赵四");
        System.out.println("b3:"+b3);
        System.out.println(coll);//[李四, 王五, 张三, 赵六, 田七]
 /*
            public boolean contains(Object obj) 判断集合中是否包含指定的元素
            返回值:boolean
                集合中包含指定的元素,返回true
                集合中不包含指定的元素,返回false
         */
        boolean b4 = coll.contains("迪丽热巴");
        System.out.println("b4:"+b4);//b4:false

        boolean b5 = coll.contains("田七");
        System.out.println("b5:"+b5);//b5:true

        /*
            public boolean isEmpty() : 判断当前集合是否为空。
            返回值:boolean
                集合中没有元素,是空的,返回true
                集合中有元素,返回false
         */
        boolean b6 = coll.isEmpty();
        System.out.println("b6:"+b6);//b6:false

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

 /*
            public Object[] toArray() : 把集合中的元素,存储到数组中
                把集合转换为数组
         */

       Object[] arr = coll.toArray();
       System.out.prontln(Arrays.toString(arr));//[李四, 王五, 张三, 赵六, 田七]


        /*
            public void clear() :清空集合中所有的元素。
            注意:
                此方法只是清空集合中的元素,集合还存在,还可以继续使用
         */
        coll.clear();
        System.out.println(coll);//[]

        boolean b7 = coll.isEmpty();
        System.out.println("b7:"+b7);//b7:true
 }
}

Iterator迭代器

1.迭代器的概述

迭代器的由来:
集合中有很多种,每种集合的数据结构不同,集合取出元素的方式也不同
我们不可能为每种集合都定义一种取出元素的方式, 所以我们可以使用迭代器,是集合通用的取出元素的方式
迭代器的原理:
判断集合中还没有没有元素,有就取出元素,再继续判断集合中有没有元素,有再取出元素;一直判断到集合中没有元素为止
这种取出元素的方式叫迭代
java.util.Iterator:描述迭代器的接口
对 collection 进行迭代的迭代器。
Iterator接口中常用的方法:
boolean hasNext() 如果仍有元素可以迭代,则返回 true。
判断集合中是否还有元素;有返回true,没有返回false
E next() 返回迭代的下一个元素。 取出集合中的元素
----------------------------------------------------------------------------
Iterator是一个接口无法创建对象使用,使用Iterator接口的实现类对象,Iterator接口的实现类是每个集合的内部类。
我们可以使用"Collection集合中的iterator()方法",该方法返回的就是迭代器的实现类对象
Iterator iterator() 返回在此 collection 的元素上进行迭代的迭代器。

2.迭代器的基本使用

public class DemoIterator{
  public static void main(String[] args){
      //1.创建集合对象,往集合中添加元素
        Collection<String> coll = new ArrayList<>();
        coll.add("詹姆斯");
        coll.add("姚明");
        coll.add("科比");
        coll.add("欧文");
        coll.add("艾弗森");
  }
 /*
            2.使用Collection接口中的方法iterator(),获取迭代器的实现类对象
            注意:迭代器是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型
         */
        //多态 接口         =  实现类对象
        Iterator<String> it = coll.iterator();

  //3.使用迭代器对象中的方法hasNext和next遍历集合
        /*
            我们发现使用迭代器取出元素是一个重复的过程,所以可以使用循环优化
            不知道集合中有多少元素,使用while循环
            while循环结束的条件:it.hasNext方法返回false
         */
         while(it.hasNext()){
          String s = it.next();
          System.out.println(s);
       }
        System.out.println("---------------------------------------");
        for(Iterator<String> it = coll.iterator(); it.hasNext();){
           String s = it2.next();
           System.out.println(s);
        }
}

3迭代器的原理

在这里插入图片描述

4迭代器的并发修改异常

在这里插入图片描述
如下方代码:

/*
    迭代器的并发修改异常:在使用迭代器遍历集合的过程中,对集合的长度进行了修改,迭代器就会抛出并发修改异常
    ConcurrentModificationException
    注意:
        1.并发:遍历和修改必须同时进行
        2.修改集合的长度:添加元素,删除元素
    解决方案:
        1.遍历集合的同时,不会集合的长度进行修改
        2.Iterator接口有一个子接口叫ListIterator
            在ListIterator中定义了往集合中添加和删除元素的方法
            public interface ListIterator<E>extends Iterator<E>
                void add(E e)  往集合中添加元素的方法
                void remove()  移除的是next方法取出的元素
      注意:
        1.如果要使用迭代器中add|remove方法,往集合中添加|删除元素
            就相当于集合和迭代器商量好了,可以往集合中添加和删除元素,迭代器就不会抛出并发修改异常
        2.ListIterator迭代器只能遍历List接口下的集合,不能遍历Set接口下的集合
 */
public class Demo02Iterator {
    public static void main(String[] args) {
        //创建集合对象,往集合中存储元素
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add(null);
        list.add("ccc");
        list.add("ddd");
        //使用迭代器遍历集合
        //使用集合中的方法iterator获取迭代器的实现类对象
        Iterator<String> it = list.iterator();
        //使用迭代器对象中的方法hasNext和next遍历集合
        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);

            /*
                需求:增加一个判断,如果取出的元素s是"ccc"
                就给集合中添加一个元素"itcast"
                技巧:使用equals方法判断的时候,一般都把已知的值写在前边,防止空指针异常
             */
            if("ccc".equals(s)){
                st.add("hhhh");
            }
        }
        System.out.println("-----------------------------------------");
        //使用List接口中的方法listIterator获取ListIterator迭代器的实现类对象
        ListIterator<String> lit = list.listIterator();
        //使用迭代器中的方法hasNext和next遍历集合
        while (lit.hasNext()){
            String s = lit.next();
            System.out.println(s);

            /*
                需求:增加一个判断,如果取出的元素s是"ccc"
                就给集合中添加一个元素"itcast"
                技巧:使用equals方法判断的时候,一般都把已知的值写在前边,防止空指针异常
             */
            if("ccc".equals(s)){
               t.add("ikhi");//使用迭代器中add方法,往集合中添加元素
                lit.remove();//删除的是next方法取出的元素 [aaa, bbb, null, ddd]
            }
        }
        System.out.println(list);//[aaa, bbb, null, ccc, itcast, ddd]
    }
}
------------------------------------------------------------------------
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.llz.dome01.Demo01Iterator.main(Demo01Iterator.java:21)

6增强for循环

note:
增强for循环底层是一个iterator迭代器,所以在是增强for循环遍历时,不能对集合长度进行修改,会抛出并发修改异常

在这里插入图片描述

/*
    增强for循环:
        是JDK1.5之后出现的新特性
        使用for循环的方式,对迭代器进行了简化,增强for循环内部就是迭代器,对迭代器进行了封装
    Collection接口有一个父接口叫Iterable
        public interface Collection<E>extends Iterable<E>
        实现这个接口允许对象成为 "foreach" 语句的目标。
        Collection接口继承了Iterable接口,就可以使用增强for循环
        Collection接口所有的实现类,都可以使用增强for循环(ArrayList,LinkedList,HashSet,LinkedHashSet...)
    增强for循环的格式:重点
        for(集合|数组中元素的数据类型 变量名: 集合|数组){
            sout(变量名);
        }
 */
public class Demo03Foreach {
    public static void main(String[] args) {
        show04();
    }

    /*
        使用增强for循环遍历集合
     */
    private static void show04() {
        ArrayList<Person> list = new ArrayList<>();
        Person p1 = new Person("柳岩",18);
        list.add(p1);//如果对象只使用一次,要使用匿名对象
        list.add(new Person("迪丽热巴",18));
        list.add(new Person("古力娜扎",18));
        list.add(new Person("赵丽颖",18));
        //快捷键:不建议使用  list.for回车
        for(Person p : list){
            System.out.println(p);
        }
    }

    /*
        使用增强for循环遍历集合
     */
    private static void show03() {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(null);
        list.add(3);
        list.add(4);
        for(Integer i : list){   //1.int  2.Integer
            System.out.println(i);
        }
    }

    /*
        使用增强for循环遍历数组
        好处:
            可以在遍历的过程中使用元素特有的方法
     */
    private static void show02() {
        String[] arr = {"aaa","bbbbbbbbbb","ccccc"};
        for(String s : arr){
            System.out.println(s+"--->"+s.length());
        }
    }

   /*
        使用增强for循环遍历数组
        好处:
            格式简单
        弊端:
            只能遍历,不能修改数组中的元素
     */
    private static void show01() {
        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]);//arr1[0]:2
        System.out.println("---------------------------");
        int[] arr2 = {1,2,3};
        //使用增强for循环遍历数组
        for(int i : arr2){
            i *= 2;
            System.out.println(i);
        }
        System.out.println("arr2[0]:"+arr2[0]);//arr2[0]:1
    }
}

7泛型

在这里插入图片描述

使用泛型的好处


定义和使用含有泛型的类

public class Demo01GenericClass {
    public static void main(String[] args) {
        //创建GenericClass对象,泛型使用String类型
        GenericClass<String> gc = new GenericClass();
        gc.setName("aaa");

        String name = gc.getName();
        System.out.println(name);

        //创建GenericClass对象,泛型使用Integer类型
        GenericClass<Integer> gc2 = new GenericClass<>();
        gc2.setName(10);

        Integer in = gc2.getName();
        System.out.println(in);
    }
}

定义和使用含有泛型的方法(重点)

/*
    定义和使用含有泛型的方法(重点)
        泛型需要定义在方法修饰符和返回值类型之间
    定义格式:
        修饰符 <泛型> 返回值类型 方法名(参数-->使用泛型){
            方法体(使用泛型)
        }
    什么时候确定泛型的数据类型:
        调用方法,传递的参数是什么类型,方法的泛型就是什么类型
 */
public class GenericMethod {
    //定义含有泛型的方法
    public <M> void method(M m){
        System.out.println(m);
    }

    //定义含有泛型的静态方法
    public static <S> void show(S s){
        System.out.println(s);
    }

    //定义含有泛型的方法,返回值类型使用泛型
    public <AAA> AAA show02(AAA aaa){
        System.out.println(aaa);
        return aaa;
    }
}

定义泛型接口

/*
    定义含有泛型的接口
 */
public interface GenericInterface<I> {
    //定义抽象方法,使用接口上的泛型
    public abstract void show(I i);
}

-------------------------------------------------------------------------
/*
    含有泛型的接口:第一种使用方式
    定义一个类,实现含有泛型的接口,在实现的同时,指定泛型的类型
    格式:
        public class GenericInterfaceImpl1 implements GenericInterface<String> {
            接口中方法使用的泛型String
        }

        public class GenericInterfaceImpl1 implements GenericInterface<Integer> {
            接口中方法使用的泛型Integer
        }
 */
public class GenericInterfaceImpl1 implements GenericInterface<String> {
    @Override
    public void show(String s) {
        System.out.println(s);
    }
}

-------------------------------------------------------------------------/*
    含有泛型的接口:第二种使用方式
        定义实现类实现含有泛型的接口,接口使用什么泛型,实现类就使用什么泛型
        就和定义一个含有泛型的类是一样的
    格式:
        public class GenericInterfaceImpl2<I> implements GenericInterface<I>{
            方法上使用的泛型(I i){}
        }

        public class GenericInterfaceImpl2<E> implements GenericInterface<E>{
            方法上使用的泛型(E e){}
        }
    注意:
        创建实现类的时候,确定泛型的数据类型;创建类使用什么泛型,泛型就是什么类型
 */
public class GenericInterfaceImpl2<I> implements GenericInterface<I>{
    @Override
    public void show(I i) {
        System.out.println(i);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值