泛型与set接口

泛型的概念:

    用来灵活的将数据类型应用到不同的类,方法和接口中,将数据类型作为参数进行传递。

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

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

       1: 当创建对象对象时,确定泛型的类型。

      ArrayList<String> list = new ArrayList<String>();         此时,变量E的值就是String类型,也就是说集合里的方法也必须是string类型。

    2:子类继承的时候明确。public final class Scanner implements Iterator<String> {}  当继承或类实现接口的时候定义泛型,如果始终定义成<E>类型,可以创建对象时候的定义类型。

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

                                                               Iterator<String> it = list.iterator();

不加泛型的问题:

    当ArrayList集合中存储了不同的数据类型,只能用Object接,实际上就是将所有的数据类型进行向上转型(自动转型,自动装箱,则包装类成了Object的子类),也就是说不指定泛型,则泛型就成为了Object类型,只要规定了泛型,不必进行向下转型,不会出现类型转换异常。

使用泛型的好处:

    将运行时期的ClassCastException,转移到了编译时期变成了编译失败,避免了类型强转的麻烦。

泛型通配符与泛型限定:

    泛型通配符  ? (传谁都行),也就是当用for循环增强遍历时,传的类型只能是Object类型,

      泛型限定符 :      1: 限定上限    ?extends 父类   泛型必须是父类或父类的子类         2: 限定下限    ?  super  子类    泛型必须是子类或者子类的父类

                public static void get(ArrayList<? > arr){

                public static void get(ArrayList<? extends Person> arr){
                   public static void get(ArrayList<? super Person> arr){
                      for(Object obj:arr){
                          System.out.println(obj);
                      }
                    }

    当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。

    代码体现:

      public class Demo02 {
       public static void main(String[] args) {
            ArrayList<Student> arr=new ArrayList<Student>();
            arr.add(new Student("小红帽",18));
            arr.add(new Student("大灰狼",20));
            ArrayList<Worker> brr=new ArrayList<Worker>();
            brr.add(new Worker("tom",19));
            brr.add(new Worker("jerry",20));
            ArrayList<Teacher> crr=new ArrayList<Teacher>();
            crr.add(new Teacher());
            crr.add(new Teacher());
            get(arr);
            get(brr);  
          }
          public static void get(ArrayList<? extends Person> arr){      传arr,brr,crr的类型,ArrayList,只有泛型不一样,同时只有定义类或类中的方法时才可以使用E,使用泛型不可以用E,
            for(Object obj:arr){                        泛型里没有多态的概念,类才认泛型,
                System.out.println(obj);
              }
          }
      }

List接口:

    特点:

      1:是一个元素存取有序的集合。

      2:是一个带索引的集合。

      3:集合中可以有重复的元素。

    List接口常用方法:

      

             在迭代时,不要使用集合的方法操作元素,也就是不要改变集合长度,在迭代时对元素操作可以通过ListIterator迭代器操作元素。

ArrayList集合:

    ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快。

LinkedList集合:

    LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。

    常用方法:

        

 java中(List集合中)的数据存储的四种结构:

  1:堆栈:先进后出

  2:队列:先进先出

  3:数组结构:有下标,查询快,增删慢,因为数组长度不可变,所有要重新创建一个数组

  4:链表结构:查询慢,无下标(从头开始查),增删快,不需要创建新的链表。

内存中的存储结构 :方法和数据共享区,栈内存,堆内存。   

原文地址:https://www.cnblogs.com/maxuefeng/p/13807722.html