集合框架
一、集合框架概述
1、Java集合框架包含的内容
Java集合框架为我们提供一套性能优良、使用方便的接口和类,它们都位于java.util包中。
集合框架是为表示和操作集合而规定的一种统一的标准体系结构。集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
接口:表示集合的抽象数据类型,如Collection、List、Set、Map、Iterator
实现:集合框架中接口的具体实现,如ArrayList、LinkedList、HashMap、HashSet
算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,如查找、排序等
Java集合框架中的两大类接口:Collection和Map。其中,Collection又有两个子接口:List和Set。所以通常说Java集合框架共有三大接口:List、Set和Map。它们的共同点:都是集合接口,都可以用来存储很多对象。它们的区别如下。
Collection接口存储一组不唯一(允许重复)、无序的对象
Set接口继承Collection接口,存储一组唯一(不允许重复)、无序的对象
List接口继承Collection接口,存储一组不唯一(允许重复)、有序(以元素插入的次序来放置元素,不会重新排列)的对象
Map接口存储一组成对的键-值对象,提供key(键)到value(值)的映射。Map中的key不要求有序,不允许重复。value同样不要求有序,但允许重复
Iterator接口是负责定义访问和遍历元素的接口
二、List接口
实现List接口的常用类有ArrayList和LinkedList。它们都可以容纳所有类型的对象,包括null,允许重复,并且都保证元素的存储顺序
ArrayList对数组进行了封装,实现了长度可变的数组。ArrayList存储数据的方式和数组相同,都是在内存中分配连续的空间
LinkedList采用链表存储方式,优点在于插入、删除元素时效率比较高。它提供了额外的addFirst()、addLast()、removeFirst()和removeLast()等方法,可以在LinkedList的首部或尾部进行插入或删除操作
1、ArrayList集合类
List接口中定义的各种常用方法(也是ArrayList的各种常用方法),如表所示
方法名称 | 说明 |
---|---|
boolean add(Object o) | 在列表末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素,原索引位置及其后面的元素依次后移。注意:新添加元素的索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。注意:取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
2、LinkedList集合类
LinkedList的各种常用方法,LinkedList除了上面的各种方法之外,还包括一些特殊的方法,如表所示
方法名称 | 说明 |
---|---|
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
三、Map接口
1、HashMap集合类
Map接口存储一组成对的键-值对象,提供key(键)到value(值)的映射。Map中的key不要求有序,不允许重复。value同样不要求有序,但允许重复。最常用的Map实现类是HashMap,它的存储方式是哈希表。哈希表也称为散列表,是根据关键码值(key value)而直接进行访问的数据结构
Map接口中定义的各种常用方法(也是HashMap的各种常用方法),如表所示
方法名称 | |
---|---|
Object put(Object key,Object value) | 以“键-值对”的方式进行存储。注意:键必须是唯一的,值可以 |
Object get(Object key) | 根据键返回相关联的值,若不存在指定的键,则返回null |
Object remove(Object key) | 删除指定的键映射的“键-值对” |
int size() | 返回元素个数 |
Set keySet() | 返回键的集合 |
Collection values() | 返回值的集合 |
boolean containsKey(Object key) | 若存在指定的键映射的“键—值对”,则返回true |
boolean isEmpty() | 若不存在键—值映射关系,则返回true |
void clear() | 从此映射中移除所有映射关系 |
四、迭代器Iterator
所有集合接口和类都没有提供相应的遍历方法,而是把遍历交给迭代器Iterator完成。Iterator为集合而生,专门实现集合的遍历。它隐藏了各种集合实现类的内部细节,提供了遍历集合的统一编程接口。
Collation接口的iterator()方法返回一个Iterator,然后通过Iterator接口的两个方法即可方便地实现遍历。
1、booleam hasNext():判断是否在另一个可访问的元素。
2、Object next():返回要访问的下一个元素
1、使用Iterator遍历集合类
通过for()循环和get()方法配合实现了List中元素的遍历,下面通过Iterator来实现遍历,代码如下。
/**
*测试通过Iterator遍历List
*/
public class Test5 {
public static void main(String[] args) {
/*1.创建多个狗狗对象*/
Dog ououDog=new Dog("欧欧","雪纳瑞");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","雪纳瑞");
Dog feifeiDog=new Dog("菲菲","拉布拉多");
/*2.创建Map集合对象并把多个狗狗对象放入其中*/
Map dogMap=new HashMap();
dogMap.put(ououDog.getName(),ououDog);
dogMap.put(yayaDog.getName(),yayaDog);
dogMap.put(meimeiDog.getName(),meimeiDog);
dogMap.put(feifeiDog.getName(),feifeiDog);
/*3.通过迭代器依次输出集合所有狗狗的信息*/
System.out.println("使用Iterator遍历,"+"所有狗狗的昵称和品种分别是:");
Set keys=dogMap.keySet(); //取出所有key的集合
Iterator it=keys.iterator(); //获取Iterator对象
while(it.hasNext()) {
String key=(String)it.next();//取出key
Dog dog=(Dog)dogMap.get(key);//根据key取出对应的值
System.out.println(key+"\t"+dog.getStrain());
}
}
}
五、泛型集合
Collation的add(Object obj)方法的参数是Object类型,无论把什么对象放入Collation及其子接口或实现类中,认为只是Object类型,在通过get(int index)方法取出集合中元素时必须进行强制类型转换,不仅烦琐而且容易出现ClassCastException异常。Map中使用put(Object key,Object value)和get(Object key)方法存取对象时、使用Iterator的next()方法获取元素时也存在同样的问题
JDK1.5中通过引入泛型(Generic)有效解决了这个问题。在JDK1.5中已经改写了集合框架中的所有接口和类,增加了泛型的支持
使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无须进行类型强制转换,并且如果把非指定类型对象放入集合,会出现编译错误
1、泛型集合的应用
对List和ArrayList应用泛型,代码所示
/**
*测试对List应用泛型
*/
public class Test6 {
public static void main(String[] args) {
/*1、创建多个狗狗对象*/
Dog ououDog=new Dog("欧欧","雪纳瑞");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","雪纳瑞");
Dog feifeiDog=new Dog("菲菲","拉布拉多");
/*2、创建ArrayList集合对象并把多个狗狗对象放入其中*/
List<Dog> dogs=new ArrayList<Dog>(); //标记元素类型
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2,feifeiDog); //添加feifeiDog到指定位置
//dogs.add("hello"); //出现编译错误,元素类型不是Dog
/*3、显示第三个元素的信息*/
Dog dog3=dogs.get(2); //无须类型强制转换
System.out.println(dog3.getName()+"\t"+dog3.getStrain());
/*4、使用foreach语句遍历dogs对象*/
System.out.println("\n所有狗狗的信息如下:");
for(Dog dog:dogs) { //无须类型强制转换
System.out.println(dog.getName()+"\t"+dog.getStrain());
}
}
}
对Map和HashMap应用泛型,代码所示
/**
*测试对Map应用泛型
*/
public class Test7 {
public static void main(String[] args) {
/*1、创建多个狗狗对象*/
Dog ououDog=new Dog("欧欧","雪纳瑞");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","雪纳瑞");
Dog feifeiDog=new Dog("菲菲","拉布拉多");
/*2、创建Map集合对象并把多个狗狗对象放入其中*/
Map<String,Dog> dogMap=new HashMap<String,Dog>();
dogMap.put(ououDog.getName(), ououDog);
dogMap.put(yayaDog.getName(), yayaDog);
dogMap.put(meimeiDog.getName(), meimeiDog);
dogMap.put(feifeiDog.getName(), feifeiDog);
/*3、通过迭代器依次输出集合中所有狗狗的信息*/
System.out.println("使用Iterator遍历,所有狗狗的昵称和品种分别是:");
Set<String> keys=dogMap.keySet(); //取出所有key的集合
Iterator<String> it=keys.iterator(); //获取Iterator对象
while(it.hasNext()) {
String key=it.next(); //取出key,无需类型强制转换
Dog dog=dogMap.get(key); //根据key取出对应的值,无需类型强制转换
System.out.println(key+"\t"+dog.getStrain());
}
/* //使用foreach语句输出集合中所有狗狗的信息
for(String key:keys){
Dog dog=dogMap.get(key); //根据key取出对应的值,无需类型强制转换
System.out.println(key+"\t"+dog.getStrain());
}
*/
}
}
Java中共有八个包装类:Byte、Short、Integer、Long、Float、Double、Boolean、Character。