javaweb学习总结六(泛型)
2016-07-30 11:54
295 查看
一:泛型的概念
泛型用来现在集合中的存储类型,防止取出时强制转换发生错误。
1:没有使用泛型时,如下:
而是运行时错误
2:使用泛型后,如下:
二:使用泛型进行存取
可以使用传统的迭代器的keyset或者entryset方式,或者使用增强for循环
这里要注意,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:自定义泛型方法
如下在方法上声明泛型:
如果有返回值,可以避免类型的强制转换:
可以声明多个泛型:
练习题:使用泛型,颠倒数组内的元素
2:自定义泛型类
如果在类里有很多方法使用泛型,可以将泛型定义在类上。
泛型用来现在集合中的存储类型,防止取出时强制转换发生错误。
1:没有使用泛型时,如下:
@Test public void test1() { List list = new ArrayList(); list.add("aaa"); Integer i = (Integer) list.get(0); // 编译时并不会报错 System.out.println(i); }
而是运行时错误
2:使用泛型后,如下:
二:使用泛型进行存取
可以使用传统的迭代器的keyset或者entryset方式,或者使用增强for循环
@Test public void test3() { Map<Integer, String> map = new HashMap<Integer, String>(); map.put(1, "aaa"); map.put(2, "bbb"); map.put(3, "ccc"); // 传统keyset System.out.println("传统keyset方式......"); Set<Integer> set = map.keySet(); Iterator<Integer> it = set.iterator(); while (it.hasNext()) { Integer key = it.next(); String value = map.get(key); System.out.println(key + "=" + value); } // keyset 增强for System.out.println("keyset...增强for"); for (Integer key : map.keySet()) { String value = map.get(key); System.out.println(key + "=" + value); } // 传统entryset System.out.println("传统entryset方式"); Set<Map.Entry<Integer, String>> entry = map.entrySet(); Iterator<Entry<Integer, String>> item = entry.iterator(); while (item.hasNext()) { Entry<Integer, String> en = item.next(); Integer key = en.getKey(); String value = en.getValue(); System.out.println(key + "=" + value); } // entryset 增强for System.out.println("entryset...增强for"); for (Map.Entry<Integer, String> entr : map.entrySet()) { Integer key = entr.getKey(); String value = entr.getValue(); System.out.println(key + "=" + value); } }
这里要注意,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:自定义泛型方法
如下在方法上声明泛型:
如果有返回值,可以避免类型的强制转换:
可以声明多个泛型:
public <T, K, V> void defineGeneric(T t, K k, V v) { System.out.println(t + ":" + k + ":" + v); }
练习题:使用泛型,颠倒数组内的元素
@Test public void test5() { Integer[] arr = { 1, 2, 3, 4, 5, 6 }; System.out.println(Arrays.toString(arr)); reverse(arr); System.out.println(Arrays.toString(arr)); } // 使用泛型,颠倒数组中所有的元素 public <T> void reverse(T[] t) { for (int i = 0, j = t.length - 1; i < t.length / 2; i++, j--) { exChange(t, i, j); } } // 使用泛型,交互数组中两个元素 public <T> void exChange(T[] t, int a, int b) { T temp = t[a]; t[a] = t[b]; t[b] = temp; }
2:自定义泛型类
如果在类里有很多方法使用泛型,可以将泛型定义在类上。
相关文章推荐
- spring
- Java集合List和Set的原理
- Spring 从零开始(Myeclipse10)
- Spring MVC 源码
- Java基础——处理对象
- 1. 《深入理解Java虚拟机》Java运行时数据区域
- Spring4笔记----AOP概述
- java中关键字volatile的作用
- JavaWeb实现文件上传下载功能实例解析
- Java编程题目-5:回文数
- Java实现复制文件夹到指定路径
- Java修饰符static,final,abstract
- Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式
- 中序线索二叉树Java实现
- linphone-LinphoneProxyConfig.java文件分析
- java运行时类信息----原理、API及应用
- 写java时候,可能会经常遇到异常,如果对异常有个清晰的认识,异常并不可怕
- java中方法的参数传递的是什么?
- java 获取汉字拼音和首字母
- Spring Boot / Spring MVC 入门实践 (三) : 入门项目介绍与用户注册登录的实现