Java集合与泛型

来自CloudWiki
跳转至: 导航搜索

什么是泛型

泛型就是定义一种模板,例如ArrayList<T>,然后在代码中为用到的类创建对应的ArrayList<类型>:

ArrayList<String> strList = new ArrayList<String>();

如下文中的Collection<String> books 就是应用了泛型。

import java.util.ArrayList;
import java.util.Collection;

public class TestForeach {
	public static void main(String[] args) {
		Collection<String> books = new ArrayList();
		// 添加元素
		books.add("Think in java");
		books.add("java 讲义");
		books.add("java 语言程序设计");
		books.add("疯狂java讲义");
		// 遍历集合
		System.out.println("书库中的书籍有:");
		for (Object book : books) {
			System.out.println((String) book);
		}
	}
}

为什么使用泛型

如6.1.3.1节中程序所示,集合中保存的元素都是Object类型,这样会带来两个问题:

  • 一是从集合中取出数据后,通常需要进行强制类型转换,如下所示:
Collection books=new ArrayList();
books.add("Think in java");
		books.add("java 讲义");
		books.add("java 语言程序设计");
		books.add("疯狂java讲义");
String book=(String)books.get(0);
  • 二是没有错误检查,可以向集合中存入任何类型的数据。
books.add(5);

对于这个调用,编译和运行都不会出错。然而将get结果强制转换成Book类型时,会引发ClassCastException错误。

import java.util.List;
import java.util.ArrayList;
import java.util.Collection;

public class TestForeach {
	public static void main(String[] args) {
	    List arrayList = new ArrayList();
	    arrayList.add("aaaa");
	    arrayList.add(100);
	     
	    for(int i = 0; i< arrayList.size();i++){
	        String item = (String)arrayList.get(i);
	        System.out.println("泛型测试"+"item = " + item);
	    }
	}
}

为了解决这种麻烦,JDK1.5中支持一项新特性--java泛型。


在集合中使用泛型

泛型的使用

基本语法:

Collection<类型参数>  变量 = new ArrayList<> ();

例如:

Collection<Interger> num=new ArrayList();
Collection<Book> books=new ArrayList();

这里的Interger意指Java的包装类型。

下面程序演示了泛型在集合中的使用:

public class TestGeneric {
	public static void main(String[] args) {
		// 定义集合时候使用泛型
		Collection<String> books = new ArrayList();
		books.add("Think in java");
		books.add("java 讲义");
		books.add("java 语言程序设计");
		books.add("疯狂java讲义");
		// 读取集合中的元素无需进行强制类型转换
		for (String book : books)
			System.out.println(book);
	}
}

使用泛型的好处

当调用get方法的时候,不需要进行强制类型转换,编译器就知道返回类型是String,而不是Object:

String book=books.get(0)

编译器还知道books集合中存储的是String类型数据,在编写代码时候会进行类型检查,避免插入错误对象。例如

books.add(5);

是无法通过编译的。


Java的包装类型

Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,对应如下:

  • 原始类型:boolean,char,byte,short,int,long,float,double
  • 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double

顺便一提,Java中的基本数据类型只有以上8个,除了基本类型(primitive type),剩下的都是引用类型(reference type)。

练一练:用泛型的方法创建一个列表

返回 Java程序设计