• 集合的笼统介绍之Collection


    作为处于容器最高层级的collection接口,它与下面的集合都处于和父子关系,如ArrayList是继承的抽象方法,抽象方法之上是list接口,它们之间的继承关系如下图。

    其中,list是有序接口,set是无序接口。

    如同所有的集合一样,作为顶层接口的collection也具有①创建方式②集合方法③遍历。

    方式1:Collection<元素类型> 变量名 = new ArrayList<元素类型>();
    方式2:Collection 变量名 = new ArrayList();

    用案例来描述一下。①创建对象

    package com.oracle.demo;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    //集合的接口
    public class Demo03 {
        public static void main(String[] args) {
            //向上转型 父类对象 变量名=new 子类对象();
            Collection<String> col=new ArrayList<String>();
            col.add("你好");
            col.add("敖丙");
            col.add("龙王");
            col.add("李靖");

    ps:集合所有的创建方式都是根据多态进行的。这里的意思就是一个一个string类型的collection接口指向new ArrayList,也就是一个string类型的ArrayList集合。

    ②常用方法

    根据java面向对象的思想,我们知道ArrayList集合是实现了list接口,list又是继承了collection接口。那么,collection也有常用方法。如:

    public class Jihe {
        public static void main(String[] args) {
            //因为它是接口,所以不能new对象,只能多态新建一个子类对象
            Collection<Integer> col =new ArrayList<Integer>();
            //添加元素add
            col.add(123);
            col.add(456);
            col.add(789);
            //删除元素
            col.remove(456);
            //清空集合
        //    col.clear();
            //向下转型,因为set和list接口不全都是有序的,所以这个下标不是公共的,需要调取list的独有方法
            if(col instanceof ArrayList){
            ArrayList<Integer> list=(ArrayList<Integer>)col;
            //无法便利的原因是collection接口中缺少get方法
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i));
                }
            }
    其中collection可以向下转型,如
    collection col=new Arraylist();//因为如果不声明类型的话直接提升到object类型

      coll.add("abc");

      coll.add("aabbcc");

      coll.add("cat");

    Iterator it=col.iterator();//有两种方式可以向下转型,一种是直接声明类型,Iterator <string> it=col.iterator();

    while(it.hasnext){

      //第二种:多态向下转型。

    String str = (String) it.next();

    }
            //判断集合中是否包含某个元素
            boolean flag=col.contains(999);
            System.out.println(flag);
            //将集合转为数组,object可以直接转inteager,integer不能直接转object,数组没有继承关系
            Object [] arr=col.toArray();
            for(int i=0;i<arr.length;i++){
                System.out.println(arr[i]);
                }
            }

    ③遍历。

    从collection常用方法中,我们发现他没有可以用来提取元素的方法。这也是collection下的特性,这里有两个方法。

    1.迭代器 Iterator

    Iterator迭代器是一个抽象接口,它是collection为了可以遍历数组而实现的接口,继承了里面的方法,如

    而根据方法重写的特性重写了Iterator方法。

    它的流程图解是

    也就是说,hasnext是判断集合中是否有元素,next是执行一次走一次,直到走到集合里面没有元素为止,划重点,hasnext会有一个初始值如上图的程序员,所以我们遍历的时候最好用数值接一下,以防next走两遍出现空值异常。

    它的书写流程如下:

    public static void main(String[] args) {
            //person类的collection接口
            Collection<Person> col =new ArrayList<Person>();
            col.add(new Person("司南",22));
            col.add(new Person("周戎",25));
            col.add(new Person("楚慈",27));
            //获取迭代器 这里需要注意的是迭代器也是采用的多态关系
            Iterator<Person> it=col.iterator();
            //
            while(it.hasNext()){
                //引用数据类型返回的是字符串
                System.out.println(it.next());
            }
        }

    2.增强for

    与普通for不同,它只适应于collection的集合和数组之中。它不能增删修改元素。数组可以用普通for的下标进行操作。

    创建对象:可以基本数据类型也可以自定义数据类型

    for(元素的数据类型 变量 : Collection集合or数组){

    }

    public static void main(String[] args) {
            //容器
            Collection<Person>col1=new ArrayList();
            col1.add(new Person("敖丙",18));
            col1.add(new Person("哪吒",18));
            col1.add(new Person("李靖",30));
            //增强for循环
            for(Person p:col1){
                System.out.println(p);
            }

    泛型。泛型的作用是声明集合整个是什么类型,用<>括起来。总共有三种应用场景。

      第一种:定义泛型的类。

    定义格式:修饰符 class 类名<代表泛型的变量> { }

    第二种:定义泛型的接口

     定义格式:修饰符 interface接口名<代表泛型的变量> { }

    <E>e表示的是万能泛型,也就是传入什么泛型都可以,传入String就是字符串类型

    泛型的好处:

    将运行时期的ClassCastException,转移到了编译时期变成了编译失败

    泛型通配符

    因为泛型是为了定义类型,也就是说最开始就直接限定死,但是如果我们想打印操作别的数据类型怎么办呢?

    当然是用<?>

    package com.oracle.demo;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    
    public class Demo07 {
        public static void main(String[] args) {
            Collection<Person> col=new ArrayList<Person>();
            col.add(new Person("司南",18));
            col.add(new Person("二少",19));
            Collection<Student> col2=new ArrayList<Student>();
            col2.add(new Student("军爷","啦啦"));
            col2.add(new Student("秀秀","lalall"));
            //调用同一个方法,编辑集合
            get(col);
            get(col2);    
        }
        //给get方法传参,传递一个collection不知道啥类的变量,这里意味上面穿什么类型的参数都可以。
        public static void get(Collection<?> col){
            //获取迭代器
            Iterator<?> it=col.iterator();
            //判断下个是否有元素
            while(it.hasNext()){
                System.out.println(it.next());
            }
        }

    但是问题接踵而至,如果我们不是相对集合进行全部的类型操作,只想操作其中的一部分,就要用到集合限定,集合的上限和下限。

    上限比较好理解,也就是上限 <? extends 集合类型>所有及以上,如<? extends object>所有的object

    下限 <? super 集合类型>也就是最少是当前类型及其以上<? extends string>最少是string,也可以是object

    首先定义两个类emp顾客类

    //顾客类
    public class Emp {
        public void work(){
            System.out.println("员工工作");
        }
    
    }
    //服务员类
    public class Waiter extends Emp {
        public void work(){
            //都有一个默认的无参构造
            System.out.println("服务员工作");
        }
    //厨师类
    public class Cook extends Emp{
        public void work(){
            System.out.println("厨师炒菜");
        }
    package com.oracle.demo3;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.Iterator;
    import java.util.Scanner;
    
    public class Demo01 {
        public static void main(String[] args) {
            Collection <Cook>col1=new ArrayList<Cook>();
            col1.add(new Cook());
            Collection <Waiter>col2=new ArrayList<Waiter>();
            col2.add(new Waiter());
            //掉一个方法遍历集合
            get(col1);
            get(col2);
            Collection <Scanner>col3=new ArrayList<Scanner>();
            //get(col3);Scanner不是emp的子类,所有不对
        }
        //定义一个方法
        //泛型的上限
        //泛型的下限
        //<? super Emp>,确定最少是emp,其他的可以是父类
        public static void get(Collection<? extends Emp> col){
            Iterator<?> id=col.iterator();
            while(id.hasNext()){
                System.out.println(id.next());
            }
        }//得出厨师炒菜,服务员服务
    }
  • 相关阅读:
    编译原理 实例
    lex yacc flex bison
    图解tensorflow 源码分析
    PostgreSQL 179个场景 案例集锦
    github view source
    Java 微服务实践
    Linux kernel AIO
    Lex与Yacc学习
    OpenResty 通过 Lua 扩展 NGINX 实现的可伸缩的 Web 平台
    nginx Architecture
  • 原文地址:https://www.cnblogs.com/a199706/p/11361374.html
Copyright © 2020-2023  润新知