您的位置:首页 > 编程语言 > Java开发

javaweb学习总结六(泛型)

2016-07-30 11:54 295 查看
一:泛型的概念

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





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:自定义泛型类

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: