JAVA泛型的使用(1)

2022-01-11  本文已影响0人  GoLearning轻松学
   /**
 * JDK1.5前不支持泛型,那时候的泛型是这样的
 */
public static void notUseGeneric(){
    List list = new ArrayList();//没有泛型时,可添加所有类型
    list.add("爷爷今年");
    list.add(89);
    list.add("岁了");

    String s1 = (String) list.get(0);
    System.out.println(s1);
    //String age = (String) list.get(1); //会报类型转换异常class java.lang.Integer cannot be cast to class java.lang.String
    //System.out.println(age);
    Integer age2 = (Integer) list.get(1);
    System.out.println(age2+"");
    String s2 = (String) list.get(2);
    System.out.println(s2);

}

输出结果:
爷爷今年
89
岁了

/**
 * JDK1.5后支持泛型
 */
public static void useGeneric(){
    //使用泛型后<>内表示限定集合中只能放某种类型的元素
    List<String> list = new ArrayList<>();
    list.add("奶奶今年");
    //list.add(85); //这里输入int,编译器会报红,提示只能输入String类型
    list.add("85");
    list.add("岁");
    System.out.println(list.get(0));
    System.out.println(list.get(1));
    System.out.println(list.get(2));
}

输出结果:
奶奶今年
85

使用了泛型无需进行强转

===================================================
在集合中使用泛型

 /**
     * 在集合中使用泛型
     */
    public static void genericInColection() {
        Set<Integer> integers = new HashSet<>();
        integers.add(1);
        integers.add(2);
        integers.add(3);
        //迭代器遍历
        System.out.println("===================迭代器遍历===================");
        Iterator<Integer> iterator = integers.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
        System.out.println("===================迭代器遍历===================\n");
        System.out.println("===================foreach遍历===================");
        //foreach遍历
        //Integer:表示集合中元素类型,integer:集合中每个元素的代称 integers:表示你要遍历的集合
        for (Integer integer : integers) {
            System.out.println(integer);
        }
        System.out.println("===================foreach遍历===================\n");


        System.out.println("===================map中的泛型===================");
        Map<Integer, String> maps = new HashMap<>();
        maps.put(1, "林冲");
//        maps.put("2","李逵");//key在泛型声明中是使用Integer,put的时候不能用String
        maps.put(2, "李逵");
        maps.put(3, "鲁智深");
        Set<Map.Entry<Integer, String>> sets = maps.entrySet();
        for (Map.Entry<Integer, String> set : sets) {
            System.out.println("key为:" + set.getKey() + " " + "value为:" + set.getValue());
        }
        System.out.println("===================map中的泛型===================\n");
        //泛型不接受8中基本数据类型,必须申明引用类型
        // List<int> list = new ArrayList<>(); //编译时报错,int是基本类型

        //Apple继承Fruit,但List<Apple>和List<Fruit>没有继承关系
        //List<Fruit> list = new ArrayList<Apple>();
        List<Fruit> list = new ArrayList<>();
    }

输出结果:
===================迭代器遍历===================
1
2
3
===================迭代器遍历===================

===================foreach遍历===================
1
2
3
===================foreach遍历===================

===================map中的泛型===================
key为:1 value为:林冲
key为:2 value为:李逵
key为:3 value为:鲁智深
===================map中的泛型===================

交换数组里两元素的位置

交换Integer数组里两元素的位置

    /**
     * 交换Integer数组里两元素的位置
     * @param intArr 数组
     * @param index1 元素的下标
     * @param index2 元素的下标
     */
    public static void changeIntArrPos(Integer[] intArr ,int index1,int index2){
        System.out.println("==================交换Integer数组里两元素的位置==========================");
        int temp = intArr[index1];
        intArr[index1] = intArr[index2];
        intArr[index2] = temp;
        System.out.println(Arrays.toString(intArr));
        System.out.println("==================交换Integer数组里两元素的位置==========================\n");

    }

交换String数组里两元素的位置

    /**
     * 交换String数组里两元素的位置
     * @param strArr 数组
     * @param index1 元素的下标
     * @param index2 元素的下标
     */
    public static void changeStringArrPos(String[] strArr ,int index1,int index2){
        System.out.println("==================交换String数组里两元素的位置==========================");
        String temp = strArr[index1];
        strArr[index1] = strArr[index2];
        strArr[index2] = temp;
        System.out.println(Arrays.toString(strArr));
        System.out.println("==================交换String数组里两元素的位置===========================\n");

    }

用泛型方法交换数组里两元素的位置

    /**
     * 用泛型方法交换数组里两元素的位置
     * @param arr 数组
     * @param index1 元素的下标
     * @param index2 元素的下标
     */
    public static <T> void changeArrPos(T[] arr , int index1, int index2){

        T temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
        System.out.println(Arrays.toString(arr));


    }
        //交换String数组里两元素的位置
        String[] strArr = {"我爷爷","今年","89岁了"};
        changeStringArrPos(strArr,0,2);
        //交换String数组里两元素的位置
        Integer[] intArr = {2,5,8,9,6,7};
        changeIntArrPos(intArr,0,4);
        System.out.println("==================用泛型方法交换数组里两元素的位置===========================");
        changeArrPos(strArr,0,2);
        changeArrPos(intArr,0,4);
        System.out.println("===================用泛型方法交换数组里两元素的位置==========================\n");

输出结果:


image.png

用泛型方法做的list遍历

    /**
     * 用泛型方法做的list遍历
     * @param lists 要遍历的列表
     * @param <T> 传入的类型
     */
    public <T> void printList(List<T> lists){
        for (T list : lists) {
            System.out.println(list);
        }
    }
      System.out.println("===================用泛型方法做的list遍历==========================\n");

        List<String> stringList = new ArrayList<>();
        stringList.add("我爸爸是");
        stringList.add("java工程师");
        stringList.add("我妈妈是");
        stringList.add("病毒科学家");
        GenericTest gt = new GenericTest();
        gt.printList(stringList);
        List<Integer> intList = new ArrayList<>();
        intList.add(5);
        intList.add(7);
        intList.add(0);
        intList.add(3);
        gt.printList(intList);
        System.out.println("===================用泛型方法做的list遍历==========================\n");

输出结果:


image.png

注意:

在泛型的lists遍历方法中,不能使用add方法,除非是add(null),因为集合的add方法是list.add(T t),要求类型为T,但是T是一个泛型,真正的类型在使用的时候确定,那么此时不能确定T的类型,所以不能使用add方法,但能add(null),但这个没意义。
可以使用get方法,因为get方法获取的就是一个T类型,建议get方法用T去接。

image.png
上一篇下一篇

猜你喜欢

热点阅读