• javaweb学习总结六(泛型)


    一:泛型的概念

    泛型用来现在集合中的存储类型,防止取出时强制转换发生错误。

    1:没有使用泛型时,如下:

    1 @Test
    2     public void test1() {
    3         List list = new ArrayList();
    4         list.add("aaa");
    5         Integer i = (Integer) list.get(0); // 编译时并不会报错
    6         System.out.println(i);
    7     }

    而是运行时错误

    2:使用泛型后,如下:

    二:使用泛型进行存取

    可以使用传统的迭代器的keyset或者entryset方式,或者使用增强for循环

     1 @Test
     2     public void test3() {
     3         Map<Integer, String> map = new HashMap<Integer, String>();
     4         map.put(1, "aaa");
     5         map.put(2, "bbb");
     6         map.put(3, "ccc");
     7 
     8         // 传统keyset
     9         System.out.println("传统keyset方式......");
    10         Set<Integer> set = map.keySet();
    11         Iterator<Integer> it = set.iterator();
    12         while (it.hasNext()) {
    13             Integer key = it.next();
    14             String value = map.get(key);
    15             System.out.println(key + "=" + value);
    16         }
    17         // keyset 增强for
    18         System.out.println("keyset...增强for");
    19         for (Integer key : map.keySet()) {
    20             String value = map.get(key);
    21             System.out.println(key + "=" + value);
    22         }
    23         // 传统entryset
    24         System.out.println("传统entryset方式");
    25         Set<Map.Entry<Integer, String>> entry = map.entrySet();
    26         Iterator<Entry<Integer, String>> item = entry.iterator();
    27         while (item.hasNext()) {
    28             Entry<Integer, String> en = item.next();
    29             Integer key = en.getKey();
    30             String value = en.getValue();
    31             System.out.println(key + "=" + value);
    32         }
    33         // entryset 增强for
    34         System.out.println("entryset...增强for");
    35         for (Map.Entry<Integer, String> entr : map.entrySet()) {
    36             Integer key = entr.getKey();
    37             String value = entr.getValue();
    38             System.out.println(key + "=" + value);
    39         }
    40     }

    这里要注意,hashmap存储是安装hashcode进行排序的,如果想按照存入时的

    顺序取出,推荐使用LinkedHashMap类,因为它的数据结构是链表。

    三:泛型使用注意事项

    1:使用泛型时,定义变量和创建对象(左右两边)泛型参数类型要一致

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

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

    以上两种方式都是错误的!

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

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

    以上两种方式都是正确的!

    a方式是为了兼容jdk1.5之前的程序,如果在jdk1.5之后写程序,会使用到泛型,想要调用

    jdk1.5之前的程序,必须兼容此种情况。

    b方式是为了兼容不同编程习惯的程序员之间可以互相调用。

    2:擦除

    在编译期时,使用泛型可以避免类型转换的错误,但是为了使泛型不影响程序运行效率,在生成

    class文件时,泛型信息会被忽略掉。

    四:自定义泛型

    1:自定义泛型方法

    如下在方法上声明泛型:

    如果有返回值,可以避免类型的强制转换:

    可以声明多个泛型:

    1 public <T, K, V> void defineGeneric(T t, K k, V v) {
    2         System.out.println(t + ":" + k + ":" + v);
    3     }

     练习题:使用泛型,颠倒数组内的元素

     1     @Test
     2     public void test5() {
     3         Integer[] arr = { 1, 2, 3, 4, 5, 6 };
     4         System.out.println(Arrays.toString(arr));
     5         reverse(arr);
     6         System.out.println(Arrays.toString(arr));
     7 
     8     }
     9 
    10     // 使用泛型,颠倒数组中所有的元素
    11     public <T> void reverse(T[] t) {
    12         for (int i = 0, j = t.length - 1; i < t.length / 2; i++, j--) {
    13             exChange(t, i, j);
    14         }
    15     }
    16 
    17     // 使用泛型,交互数组中两个元素
    18     public <T> void exChange(T[] t, int a, int b) {
    19         T temp = t[a];
    20         t[a] = t[b];
    21         t[b] = temp;
    22     }

    2:自定义泛型类

    如果在类里有很多方法使用泛型,可以将泛型定义在类上。

  • 相关阅读:
    有限元矩形单元一阶拉格朗日插值函数流程
    有限元二阶拉格朗日插值函数理论
    MATLAB有限元二维编程(三角单元)
    【项目管理】项目经理每天、每周、每月应该做的都在这
    【项目管理】中小公司PMO不一样期间的责任
    【项目管理】PRINCE2常见问答
    如何用几句话概括PRINCE2学习?
    项目管理——收益管理
    【项目管理】项目管理发展的新阶段——PRINCE2项目管理方法
    【MSP是什么】最佳管理实践指南
  • 原文地址:https://www.cnblogs.com/warrior4236/p/5720635.html
Copyright © 2020-2023  润新知