zoukankan      html  css  js  c++  java
  • Java学习之路(七):泛型

    泛型的概述和基本使用

    作用:把类型明确的工作推前到创建对象或者调用方法的时候

    泛型是一种参数化类型,把类型当做参数一样传递来明确集合的元素类型

    泛型的好处

    • 提高安全性
    • 省去强转的麻烦

    泛型的基本使用

    • 声明集合泛型的格式:List<String> li = new ArrayList<String>();
    • <>中存放的必须是引用数据类型

    泛型的注意事项

    • 默认声明一个泛型集合,前后的类型要一致
    • jdk1.7以上的新特性:在声明泛型类型的时候可以只声明前面的泛型(菱形泛型)
    • 集合声明泛型:代表此类或者子类都可以成为集合的元素

    • 声明的泛型类型一定要是引用类型

    泛型ArrayList的遍历

    package lesson03;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class Demo01 {
    
        public static void main(String[] args){
            
            List<String> li = new ArrayList<String>();
            li.add("A");
            li.add("B");
            li.add("C");
            Iterator<String> iterator = li.iterator();
            while(iterator.hasNext()){
                System.out.println(iterator.next());
            }
            
        }
        
    }
    第一种:String
    package lesson03;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class Demo01 {
    
        public static void main(String[] args){
            
            List<Student> li = new ArrayList<Student>();
            li.add(new Student(11,"null11"));
            li.add(new Student(22,"null22"));
            li.add(new Student(33,"null33"));
            li.add(new Student(44,"null44"));
            for(Student fo:li){
                System.out.println(fo);
            }
        }
        
    }
    
    class Student{
        int age;
        String name;
        public Student(int age, String name) {
            super();
            this.age = age;
            this.name = name;
        }
        public Student() {
            super();
            // TODO Auto-generated constructor stub
        }
        @Override
        public String toString() {
            return "Student [age=" + age + ", name=" + name + "]";
        }
    }
    第二种:Object

    泛型类

    定义格式:

      public class 类名<泛型类型1,...>          注意:这里可以有多个,但不建议

      我们一般写成  public class 类名<T>

    注意事项:

    • 泛型类型必须是引用类型
    • T的值是在创建对象的时候出现的

    泛型方法

    定义格式:

      public 返回类型 方法名(泛型类型 变量名)

    注意:对象方法的泛型参数要与类中的泛型一致,不可以使用其他的名字

    顺便补充:

    泛型方法的定义:

      public 返回类型(T) 方法名(泛型类型T 变量名)

    具体的例子:

    class Student<T>{    //泛型类
        private T o;                  //泛型属性
        public T getO() {
            return o;
        }
        public void setO(T o) {
            this.o = o;
        }
        public void fun1(T f1){}   //泛型方法,无参数
        public T fun2(int val){      //泛型方法,有参数
            return null;
        }
    }

    泛型接口

    其实也就是:

      public interface 接口名<数据类型>

    使用场景:Dao (数据访问层)

    泛型的高级使用(通配符)

    • <?>   表示任意类型,如果没有明确表示,那么就是Object以及任何java类
      • 一般是在传入参数的时候用的,表示接受任何类型
    • ? extends E   向下限定,E以及其子类
      • addAll方法,如果T是一个父类,那么添加的列表可以是子类,但是被添加的类表不能是子类
    • ? super E  向上限定,E以及其父类

    增强for循环

      简化数组和Collection集合的遍历

    格式:

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

      使用变量即可,这个变量就是数组或者Collection集合中的元素

    }

    其实在之前的ArrayList遍历中使用的便是增强for循环

    注意:增强for循环不能边遍历,边删除元素,增强for循环的内部还是调用了

     

    可变参数

      定义方法的时候不知道我们该定义多少个参数。

    格式:

      修饰符  返回值类型  方法名(数据类型...变量名){}

    注意事项:

    • 这里的变量在内部就封装成了一个数组
    • 如果一个方法有可变参数,并且有多个参数,可变参数要放在最后面

    补充:

    Arrays工具类的asList()方法的使用

    List<String> li = Arrays.asList("A","B","C");
    System.out.println(li);

    在Arrays工具类的asList方法中就是使用了可变参数

    Collection中的toArray(T[] a)将泛型转化为数组

    package lesson05;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Demo01 {
    
        public static void main(String[] args) {
            
            List<String> li = new ArrayList<String>();
            li.add("A");
            li.add("B");
            li.add("C");
            
            String[] arr = new String[3];
            li.toArray(arr);
            
            for(String fo:arr){
                System.out.println(fo);
            }
    
        }
    
    }

    接下类是一个小例子

    package lesson06;
    //一个例子
    //学生类
    //班级集合
    //学校集合
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class Demo1 {
    
        public static void main(String[] args) {
            List<Student> class_li = new ArrayList<Student>();
            class_li.add(new Student(1,"null1"));
            class_li.add(new Student(2,"null2"));
            class_li.add(new Student(3,"null3"));
            class_li.add(new Student(4,"null4"));
            List<List<Student>> school_list = new ArrayList<List<Student>>();
            school_list.add(class_li);
            
            for(List<Student> class_item:school_list){
                for(Student stu_item:class_item){
                        System.out.println(stu_item);
                }
            
        }
    
    }
    }
    class Student{
        int age;
        String name;
        public Student() {
            super();
        }
        public Student(int age, String name) {
            super();
            this.age = age;
            this.name = name;
        }
        @Override
        public String toString() {
            return "Student [age=" + age + ", name=" + name + "]";
        }
        
    }
    List嵌套List
  • 相关阅读:
    [CLRS][CH 19]斐波那契堆
    [CLRS][CH 20] van Emde Boas 树
    [C++11] lambda函数
    常用网站整理
    词法分析原理 Lexical Analysis
    ie8开发人员工具无法使用,按f12任务栏里出现任务,但是窗体不弹出
    IE6下zindex犯癫不起作用bug的初步研究(转)
    ie8无法浏览png格式图片
    jquery.pngFix在最新的jquery1.7上无效的问题解决方法!
    用clearfix:after消除(DIV块因内部浮动而高度收缩的问题)(转)
  • 原文地址:https://www.cnblogs.com/smiling-crying/p/9363597.html
Copyright © 2011-2022 走看看