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程序设计