zoukankan      html  css  js  c++  java
  • JavaSE_06_Collection、泛型

    1.Collection集合

     1.1 集合概述

    • 数组的长度是固定的。集合的长度是可变的。

    • 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。

      集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map

     1.2 Collection 常用功能

    Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。方法如下:

    • public boolean add(E e): 把给定的对象添加到当前集合中 。

    • public void clear() :清空集合中所有的元素。

    • public boolean remove(E e): 把给定的对象在当前集合中删除。

    • public boolean contains(E e): 判断当前集合中是否包含给定的对象。

    • public boolean isEmpty(): 判断当前集合是否为空。

    • public int size(): 返回集合中元素的个数。

    • public Object[] toArray(): 把集合中的元素,存储到数组中。

     2.1 Iterator接口

    • public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的。

    下面介绍一下迭代的概念:

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

    Iterator接口的常用方法如下:

    • public E next():返回迭代的下一个元素。

    • public boolean hasNext():如果仍有元素可以迭代,则返回 true。

    /**
     * java.util.Iterator:迭代器(对集合进行遍历)
     * - public E next()`:返回迭代的下一个元素。
     * - `public boolean hasNext()`:如果仍有元素可以迭代,则返回 true。
     * <p>
     * iterator是一个接口无法直接使用,需要使用集合中的额Iterator方法获取实现类对象,使用Iterator接口接收
     */
    public class Itertator {
        public static void main(String[] args) {
            Collection<String> coll = new ArrayList<String>();
            coll.add("张三");
            coll.add("李四");
            coll.add("王五");
            coll.add("赵六");
            Iterator<String> iterator = coll.iterator();
            //iterator.hasNext()判断集合中是否有元素
            while (iterator.hasNext()) {
                String next = iterator.next();
                System.out.println(next);
            }
        }
    }

    2.2 迭代器的实现原理

    创建迭代器对象的时候Iterator<String> iterator = coll.iterator();将指针放在-1的地方,通过iterator.hasNext();判断集合中是否有元素,如果有iterator.next(),返回下一个元素并将指针向后移一位。依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

     2.3 增强for

    增强for循环(也称for each循环)是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。

    格式:

    for(元素的数据类型  变量 : Collection集合or数组){ 
          //写操作代码
    }

    3.1 泛型概述

    在前面学习集合时,我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。

    /**
    * 集合使用泛型:
    * 好处:集合不是使用泛型默认是Objet类型,可以存储任意类型的数据
    * 避免了类型转换的异常,将运行期的异常,提升到了编译期的异常
    * 坏处:不安全,容易异常
    */
    public class GenericDemo {
        public static void main(String[] args) {
            Collection coll = new ArrayList();
            coll.add("abc");
            coll.add("itcast");
            coll.add(5);//由于集合没有做任何限定,任何类型都可以给其中存放
            Iterator it = coll.iterator();
            while(it.hasNext()){
                //需要打印每个字符串的长度,就要把迭代出来的对象转成String类型
                String str = (String) it.next();
                System.out.println(str.length());
            }
        }
    }

    3.2 泛型的定义与使用

    定义和使用含有泛型的类

    定义格式:

    修饰符 class 类名<代表泛型的变量> {  }
    class ArrayList<E>{ 
        public boolean add(E e){ }
    
        public E get(int index){ }
           ....
    }

    在创建对象的时候确定泛型

    ArrayList<String> list = new ArrayList<String>();

    此时,变量E的值就是String类型,那么我们的类型就可以理解为:

    class ArrayList<String>{ 
         public boolean add(String e){ }
    
         public String get(int index){  }
         ...
    }

    含有泛型的方法

    定义格式:

    修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  }
    public class MyGenericMethod {      
        public <MVP> void show(MVP mvp) {
            System.out.println(mvp.getClass());
        }
        
        public <MVP> MVP show2(MVP mvp) {    
            return mvp;
        }
    }

    使用格式:调用方法时,确定泛型的类型

    public class GenericMethodDemo {
        public static void main(String[] args) {
            // 创建对象
            MyGenericMethod mm = new MyGenericMethod();
            // 演示看方法提示
            mm.show("aaa");
            mm.show(123);
            mm.show(12.45);
        }
    }

    含有泛型的接口

    定义格式:

    修饰符 interface接口名<代表泛型的变量> {  }
    public interface MyGenericInterface<E>{
        public abstract void add(E e);
        
        public abstract E getE();  
    }

    1、定义类时确定泛型的类型

    public class MyImp1 implements MyGenericInterface<String> {
        @Override
        public void add(String e) {
            // 省略...
        }
    
        @Override
        public String getE() {
            return null;
        }

    此时,泛型E的值就是String类型。

    2、始终不确定泛型的类型,直到创建对象时,确定泛型的类型

    public class MyImp2<E> implements MyGenericInterface<E> {
        @Override
        public void add(E e) {
                // 省略...
        }
    
        @Override
        public E getE() {
            return null;
        }
    }

    确定泛型:

    /*
     * 使用
     */
    public class GenericInterface {
        public static void main(String[] args) {
            MyImp2<String>  my = new MyImp2<String>();  
            my.add("aa");
        }
    }

    3.4 泛型通配符

    通配符高级使用----受限泛型

    之前设置泛型的时候,实际上是可以任意设置的,只要是类就可以设置。但是在JAVA的泛型中可以指定一个泛型的上限下限

    泛型的上限

    • 格式类型名称 <? extends 类 > 对象名称

    • 意义只能接收该类型及其子类

    泛型的下限

    • 格式类型名称 <? super 类 > 对象名称

    • 意义只能接收该类型及其父类型

    例如:

    public static void main(String[] args) {
        Collection<Integer> list1 = new ArrayList<Integer>();
        Collection<String> list2 = new ArrayList<String>();
        Collection<Number> list3 = new ArrayList<Number>();
        Collection<Object> list4 = new ArrayList<Object>();
        
        getElement(list1);
        getElement(list2);//报错
        getElement(list3);
        getElement(list4);//报错
      
        getElement2(list1);//报错
        getElement2(list2);//报错
        getElement2(list3);
        getElement2(list4);
      
    }
    // 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
    public static void getElement1(Collection<? extends Number> coll){}
    // 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
    public static void getElement2(Collection<? super Number> coll){}

     

     

  • 相关阅读:
    Study Plan The Twelfth Day
    Study Plan The Fifteenth Day
    Study Plan The Seventeenth Day
    Study Plan The Tenth Day
    Study Plan The Eighth Day
    Study Plan The Eleventh Day
    Study Plan The Sixteenth Day
    Study Plan The Thirteenth Day
    Study Plan The Fourteenth Day
    Study Plan The Ninth Day
  • 原文地址:https://www.cnblogs.com/asndxj/p/11740475.html
Copyright © 2011-2022 走看看