集合的笼统介绍之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());
        }
    }//得出厨师炒菜,服务员服务
}
原文地址:https://www.cnblogs.com/a199706/p/11361374.html