泛型是jdk5.0的新特性,在这儿给大家总结一下,泛型在java中主要体现在一下几个方面:
1. 泛型方法
2. 泛型类
3. 在集合中的使用
下面具体来看一下
1.泛型方法
这里给大家举一个简单的例子说明一下。有一个整形数组:
arr[] = {1,2,3,4,5,6,7,8,9}
现在我想交换数组中的第一个和第四个元素的的顺序,要实现这个功能很简单,下面是代码:
public class Demo4 {
public static void main(String args[]) {
int arr[] = {1,2,3,4,5,6,7,8,9};
swap1(arr,0,3);
System.out.println(Arrays.toString(arr));
}
public static void swap1(int[] arr, int i, int j) {
int t;
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
现在我想把数组的类型变成字符类型或者字符串类型,这时候这个方法就得修改参数的类型,这样修改起来很麻,这里可以使用泛型让这个方法可以接受任意类型的参数,下面是代码:
public class Demo4 {
public static void main(String args[]) {
Integer arr[] = {1,2,3,4,5,6,7,8,9};
swap1(arr,1,3);
System.out.println(Arrays.toString(arr));
}
private static <A> void swap1(A[] arr, int i, int j) {
A t;
t=arr[i];
arr[i]=arr[j];
arr[j]=t;
}
}
这里给这个方法自定义了一种类型A,然后在参数里面和方法里面都可以只用这个通用类型,可以接受任意类型的数组,但是这里要注意一下,A能接受的只有对象,不能接受基本的数据类型,所以这里要把8中基本数据类型转换成相应的封装类型才可以,这个就是泛型方法的使用。
2.泛型类
泛型也可以在类中使用,代码如下:
public class Demo5<T> {
T a;
public static void main(String[] args) {
}
public void test(T b) {
T t1;
T t2[];
}
}
如果给类使用了泛型,那么这个类里可以使用这个泛型,在非静态方法上和方法里也可以使用这个类型,但是在静态方法中无法使用,要使用的话就得为这个静态方法单独定义一个类型才可以,写法和上一步中的写法一样。
3.在集合中的使用
这里要重点总结一下泛型在集合中的使用,因为泛型在集合中使用的很频繁。先简单说一下为什么要在集合中使用泛型。现在我有一个List集合,我往集合里面添加了三个字符串,代码如下:
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
}
}
现在我要把这个集合中的元素打印出来,需要用到一个for循环:
for(int i=0;i<list.size();i++) {
Object o = list.get(i);
System.out.println(o.toString());
}
在这个过程中大家会发现list集合在存数字符串的时候把字符串转换成了Object类型,大家都知道Object是所有类的父类,所以这里使用这个类型可以接受所有类型的元素,但是这里有一个问题,如果我存的是整形或者浮点型,在用里面的元素的时候必须得有个手动的类型转换的过程,这个过程可能会出现各种问题,而且加大了代码量,所以在使用集合的时候可以给集合指定具体的数据类型,这样就可以很方便的使用集合中存储的数据而且不会使数据失去本身的意义。这里简单介绍一下三种集合使用泛型的情况。
a.在List中使用
List<String> list = new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
for(int i=0;i<list.size();i++) {
String s = list.get(i);
System.out.println(s);
}
System.out.println("========================");
for(String s:list) {
System.out.println(s);
}
System.out.println("========================");
Iterator<String> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
b.在Set中使用
Set<String> set = new HashSet<String>();
set.add("aa");
set.add("bb");
set.add("cc");
for(String s:set) {
System.out.println(s);
}
System.out.println("==============");
Iterator<String> it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
c.在Map中使用
Map<String,String> map = new HashMap<String,String>();
map.put("a", "1");
map.put("b", "2");
map.put("c", "3");
Set<String> set = map.keySet();
for(String s:set) {
String value = map.get(s);
System.out.println(s+" : "+value);
}
System.out.println("=====================");
Set<Entry<String,String>> entrys = map.entrySet();
for(Entry<String,String> entry:entrys) {
String keyv = entry.getKey();
String valuev = entry.getValue();
System.out.println(keyv+" : "+valuev);
}
上面的代码还给出了多种遍历集合的方式,希望对大家有用。
4.泛型的擦除
泛型只能在源代码中起作用,源代码经过编译器编译后就会擦除泛型的作用,而改为具体传入的类型。