泛型与集合
在jdk1.2之后,Java提供了实现常见数据结构的类,这些实现数据结构的类通称为Java集合框架。在JDK1.5后,Java集合框架开始支持泛型,我们首先介绍泛型,然后讲解常见数据结构类的用法。
1、泛型
泛型(Generics)是在JDK1.5中推出的,其主要目的是可以建立具有类型安全的集合框架,如链表、散列映射等数据结构。
1.1 泛型类
可以使用“class 名称<泛型列表>”声明一个类,为了和普通的类有所区别,这样声明的类称作泛型类,如:
class ShowObject<E>
其中ShowObject是泛型类的名称,E是其中的泛型,也就是说我们并没有指定E是何种类型的数据,它可以是任何对象或接口,但不能是基本类型数据。
ShowObject类可以用泛型E作为自己的一个成员或方法中的参数,ShowObject.java的代码如下:
public class ShowObject<E> {
public showMess (E b) {
String mess = b.toString(); //泛型变量只能调用toString()方法
System.out.println(mess);
}
1.2 使用泛型类声明对象
泛型类声明和创建对象时,类名后多了一对“<>”,而且必须要用具体的类型替换“<>”中的泛型。例如:
ShowObject<A> showA;
showA=new ShowObject<A>();
1.3 泛型接口
可以使用“interface名称<泛型列表>”声明一个接口,这样声名的接口称作泛型接口如:
interface Listen<E> {
void listen(E x);
}
其中Listen<E>是泛型接口的名称,E是其中的泛型。泛型类和普通类都可以实现泛型接口,但普通类实现泛型接口时,必须指定泛型接口中泛型列表中的具体类型
1.4 泛型的目的
Java泛型的主要目的是可以建立具有类型安全的数据结构,如链表、散列表等数据结构,
最重要的一个优点就是:在使用这些泛型类建立数据结构时,不必进行强制类型转换,即运行时不进行类型检查。
JDK1.5是支持泛型的编译器,它将运行时的类型检查提前到编译时执行,使代码更安全。
2、集合
在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。
所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework)。
Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了,这样就大大提高了编程效率。
Collection Map
-List -HashMap
-ArrayList -HashTable
-LinkedList
-Vector
-Stack
-Set
-HashSet
-TreeSet
2.1 List
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。
用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和后面要学习到的Set不同,List允许有相同的元素。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
2.1.1 ArrayList
ArrayList实现了可变大小的数组。它允许所有元素,包括null。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
2.1.2 LinkedList
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。
这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
2.2 Set
Set不保存重复的元素,因此存入Set的每个元素都必须是唯一的,同时Set接口不保证维护元素的次序。
2.2.1 HashSet
它不允许出现重复元素。
不保证集合中元素的顺序。
允许包含值为null的元素,但最多只能有一个null元素。
2.3 Map
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap
Map主要用于存储健值对,根据键得到值,因此不允许键重复,但允许值重复。
2.3.1 HashMap
Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。
HashMap最多只允许一条记录的键为Null,允许多条记录的值为 Null。