泛型(Generic)小结
JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转换,这样不可避免就会引发程序的一些安全性问题。例如:
ArrayList list = new ArrayList();
list.add("abc");
Integer num = (Integer) list.get(0); //运行时会出错,但编码时发现不了
list.add(new Random());
list.add(new ArrayList());
for(int i=0;i<list.size();i++){
(?)list.get(i); //此处取出来的对象应转换成什么类型
}
JDK5中的泛形允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生问题,转变为编译时的问题,以此提高程序的可读性和稳定性(尤其在大型程序中更为突出)。
注意:泛型是提供给javac编译器使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛形的java程序后,生成的class文件中将不再带有泛形信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”。
泛形的基本术语,以ArrayList<E>为例:<>念着typeof
– ArrayList<E>中的E称为类型参数变量
– ArrayList<Integer>中的Integer称为实际类型参数
– 整个称为ArrayList<E>泛型类型
– 整个ArrayList<Integer>称为参数化的类型ParameterizedType
定义泛型
1、在方法上定义
public <T> void test1(T l){ //应用的对象}
public static <T> void test2(T l){ //应用的对象}
public <T> int test3(T l){ //应用的对象
return 0;
}
public <T> List<T> test4(){
return null;
}
2、在类上定义泛型
public class Demo03<T,E> {
public void test1(T entity){ }
public List<T> test2(){
return null;
}
注意:在类上声明的泛型不能够用在static修饰的方法上
public static <TT> void test2(TT l){ //应用的对象}
}
List数组
@Test
public void test1() {
List<String> list = new ArrayList<String>();
list.add("adc");
list.add("def");
list.add("cde");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String value = it.next();
System.out.println(value);
}
for(String value:list){
System.out.println(value);
}
}
Map
@Test
public void test2() {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "redarmy");
map.put(2, "mj");
map.put(3, "xiaoshenyang");
Set<Map.Entry<Integer, String>> entries = map.entrySet();
for (Map.Entry<Integer, String> entry : entries) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
}
@Test
public void test3() {
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "redarmy");
map.put(2, "mj");
map.put(3, "xiaoshenyang");
Set<Integer> keys = map.keySet();
Iterator<Integer> it = keys.iterator();
while (it.hasNext()) {
int key = it.next();
System.out.println(key + " " + map.get(key));
}
for(Integer key : keys){
System.out.println(key + " " + map.get(key));
}
}
@Test
public void test4(){
// List<String> list = new ArrayList<Object>();
//List<Object> list1 = new ArrayList<String>();
//上边两个表达式不正确jdk1.4之前没有泛型 jdk1.5之后才有泛型的
List<String> list = new ArrayList();
List list1 = new ArrayList<String>();
}
/** 实现一个简单的数组位置的交换 */ public static <T> void test(T arr[],int i,int j){ T temp = arr[i]; arr[i]=arr[j]; arr[j]=temp; } /* 实现数组的倒序 */ public static <T> void test1(T arr[]) { int startindex = 0; int endindex = arr.length - 1; for (;;) { if (startindex >= endindex) { break; } T temp = arr[startindex]; arr[startindex] = arr[endindex]; arr[endindex] = temp; startindex++; endindex--; } } public static void main(String[] args) { Integer arr[]={1,2,3,4}; /*test(arr,0,2); for(int ar:arr){ System.out.print("["+ar+","+"]"); }*/ test1(arr); for (int ar : arr) { System.out.print("[" + ar + "," + "]"); }
testChange(); } public static void testChange(){ int i=10; int j=111; i=i^j; j=i^j; i=i^j; System.out.println("i="+i+" "+"j="+j); }