泛型

应用:
1. 类型安全检查
2. 编写通用Java程序

  1. 类型安全检查
    JDK5 之前集合对象使用问题:
    (1)向集合添加任何类型对象。
    (2)从集合取出对象时,数据类型丢失,使用与类型相关方法,强制类型转换。
    泛型语法: List<泛型类型> 规定 List集合中元素类型
    泛型技术:只是编译器阶段技术,为javac命令,起到类型安全检查作用,生成.class文件后,泛型信息将会被擦除。
    List— 参数化模型
    例:
public void demo1() {
        // 应用泛型集合
        List<String> list = new ArrayList<String>();// 这个集合只能添加String类型数据
        list.add("泛型集合");
        list.add("指定数据类型");
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);// 取出数据
            System.out.println(s);
        }
    }

可以利用泛型技术对 Map、Set、List进行类型安全检查

  1. List: ArrayList和LinkedList
    对List遍历存在三种方法:
    (1)list是有序的可以通过size 和get(index)方法进行遍历
    (2)因为List继承collection接口,可以通过Collection 的iterator进行遍历。
    (3)JDK5引入 foreach循环结构
    例:
@Test
    public void demo2() {
        // 使用类型安全list
        List<String> list = new LinkedList<String>();
        // 使用泛型,只能向list添加 String类型
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        // 遍历list 三种方法
        // 1. 由于list是有序的 通过 size和get方法进行遍历
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }
        System.out.println("----------");
        // 2. 由于list继承collection接口 通过collection的iterator方法 进行遍历
        Iterator<String> iterator = list.iterator();
        // 遍历iterator 通过迭代器hasNext 和next方法进行遍历
        while (iterator.hasNext()) {
            String s = iterator.next();
            System.out.println(s);
        }
        System.out.println("----------");
        // 3.jdk5 引入foreach循环
        for (String s : list) {
            System.out.println(s);
        }
        System.out.println("----------");
    }
  1. Set: HashSet 使用hashCode和equals 进行排重
    TreeSet使用compareable中的compareTo进行排重和排序
    对 Set取出遍历有两种方法(因为是无序的,比list少一种方法)
    (1)继承Collection 使用Iterator遍历
    (2)JDK5foreach循环结构
@Test
    public void demo3() {
        // 使用类型安全的set
        Set<String> set = new TreeSet<String>();
        set.add("abc");
        set.add("def");
        set.add("cef");

        // 由于 set是无序的 因此 比list 少了一种方法
        // 1.set继承collection 使用 Iterator进行遍历
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()) {
            String s = iterator.next();
            System.out.println(s);
        }

        // 2.JDK5 引入foreach循环
        for (String s : set) {
            System.out.println(s);
        }
    }
  1. Map: 是一个键值对结构 执行两个类型的泛型
    遍历方法两种:
    (1)通过keySet
    (2)通过 EntrySet取出每一个键值对,getKey和getValue
@Test
    public void demo5() {
        // 使用类型安全的map map 是一个键值对结构 执行两个类型的泛型
        Map<String, String> map = new HashMap<String, String>();
        map.put("111", "aaa");
        map.put("222", "bbb");
        // 取出map 两种方法,
        // 1.通过 keyset
        Set<String> keys = map.keySet();
        for (String s : keys) {
            System.out.println(s + ":" + map.get(s));
        }

        // 2.通过map entrySet 获得每一个键值对
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for (Entry<String, String> entry2 : entrySet) {
            System.out.println(entry2.getKey() + ": " + entry2.getValue());

        }

    }

使用泛型对象进行类型转换时,等号两端对象使用泛型的类型必须一致
2. 编写通用java程序
通常是结合反射技术一起使用
自定义泛型方法
(1)定义泛型方法,必须在方法的返回值前进行泛型类型声明<泛型类型>
使用泛型方法,参数必须是对象类型

@Test
    public void demo7() {
        // 将数组元素进行倒序排列
        Integer[] arr1 = new Integer[] { 1, 2, 3, 4, 5, 6 };
        reverce(arr1);
        System.out.println(Arrays.toString(arr1));
        String[] arr2 = new String[] { "aa", "bb", "cc", "dd", "ee", "ff" };
        reverce(arr2);
        System.out.println(Arrays.toString(arr2));

    }

    // 属于引用传递 不需要返回值
    public <T> void reverce(T[] arr) {
        /**
         * 只需要遍历数组的前一半的元素,然后和后一半元素进行交换
         * 
         * */
        for (int i = 0; i < arr.length / 2; i++) {
            T temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = temp;
        }
    }

    @Test
    // 交换数组的位置
    public void demo6() {
        Integer[] arr1 = new Integer[] { 1, 2, 3, 4, 5 };
        ChangePosition(arr1, 1, 3);
        System.out.println(Arrays.toString(arr1));
        String[] arr2 = new String[] { "aa", "bb", "cc", "dd", "ee" };
        ChangePosition(arr2, 1, 3);
        System.out.println(Arrays.toString(arr2));
    }

    // 使用泛型交换数组的通用方法
    public <T> void ChangePosition(T[] arr, int index1, int index2) {
        T temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }

(2)在类名后声明类的泛型,当类使用泛型后,该类中的所有方法都可以使用泛型—在类名后<泛型类型> 不对static方法生效。

public class ArrayUtils<T> {

    public void reverce(T[] arr) {
        /**
         * 只需要遍历数组的前一半的元素,然后和后一半元素进行交换
         * 
         * */
        for (int i = 0; i < arr.length / 2; i++) {
            T temp = arr[i];
            arr[i] = arr[arr.length - 1 - i];
            arr[arr.length - 1 - i] = temp;
        }
    }

    // 使用泛型交换数组的通用方法
    public void ChangePosition(T[] arr, int index1, int index2) {
        T temp = arr[index1];
        arr[index1] = arr[index2];
        arr[index2] = temp;
    }

}
    @Test
    public void demo8() {
        // 测试 泛型类 使用
        /*
         * 在创建工具类对象时,使用泛型String, 这个工具类对象完成对String数组 倒序和 交换
         */
        ArrayUtils<String> arrayutils = new ArrayUtils<String>();
        String[] arr1 = new String[] { "aa", "bb", "cc", "dd" };
        arrayutils.ChangePosition(arr1, 1, 3);
        System.out.println(Arrays.toString(arr1));
        arrayutils.reverce(arr1);
        System.out.println(Arrays.toString(arr1));
    }

3.泛型的高级应用–泛型通配符
?:任意的泛型类型

@Test
    public void demo9() {
        List<String> list = new ArrayList<String>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        print(list);

        List<Integer> list2 = new ArrayList<Integer>();
        list2.add(111);
        list2.add(222);
        list2.add(333);
        print(list2);
    }

    public void print(List<?> list) {// 泛型类型可以是任意类型 --泛型通配符
        for (Object string : list) {
            System.out.println(string);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值