集合框架
1. 集合框架概述
引入集合框架
Java 集合框架包含的内容
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
2. 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 开始 |
对比:
- Vector 是线程安全的,ArrayList 重速度轻安全,是线程非安全的,所以当运行到多线程序环境中时候,需要程序员自己管理线程的同步问题。
- 当长度需要增长时,Vector 默认增长为原来的一倍,而 ArrayList 只增长 50%,有利于节约内存空间。
LinkedList 集合类
返回类型 | 方法 | 说明 |
void | addFirst(Object o) | 在列表的首部添加元素 |
void | addLast(Object o) | 在列表的末尾添加元素 |
Object | getFirst() | 返回列表中的第一个元素 |
Object | getLast() | 返回列表中的最后一个元素 |
Object | removeFirst() | 删除并返回列表中的第一个元素 |
Object | removeLast() | 删除并返回列表中的最后一个元素 |
3. MAP 接口
返回类型 | 方法 | 说明 |
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 |
Hashtable 和 HashMap 的异同。
HashMap 类出现之前,JDK 中存在一个和它同样采用哈希表存储方式,同样实现键值映射的集合类 Hashtable。两者实现原理相同,功能相同,很多情况下可以互 用。
两者的主要区别如下。
- Hashtable 继承自 Dictionary 类,而 HashMap 实现了 Map 接口。
- Hashtable 是线程安全的,HashMap 重速度轻安全,是线程非安全的,所以当运行到多线程环境中时,需要程序员自己管理线程的同步问题。
- Hashtable不允许null值(key和value都不允许),HashMap允许null值(key和 value 都允许)。
4. 迭代器 I TERATOR
Collection 接口的 iterate()方法返回一个 Iterator,然后通过 Iterator 接口的两个方法即可方便实现遍历。
- boolean hasNext():判断是否存在另一个可访问的元素。
- Object next(),返回要访问的下一个元素。
5 泛型集合
JDK1.5 中通过引入泛型(Generic)有效解决了这个问题。在 JDK1.5 中已经改写了集合框架中的所有接口和类,增加了泛型的支持。
使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行类型强制转换,并且如果把非指定类型对象放入集合,会出现编译错误。
数组和集合的主要区别包括以下几个方面。
- 数组可以存储基本数据类型和对象,而集合中只能存储对象(可以以包装类形式存储基本数据类型)。
- 数组长度固定,集合长度可以动态改变。
- 定义数组时必须指定数组元素类型,集合默认其中所有元素都是 Object。
- 无法直接获取数组实际存储的元素个数,length 用来获取数组的长度,但可以通过size()直接获取集合实际存储的元素个数。
- 集合有多种实现方式和不同的适用场合,而不像数组仅采用分配连续空间方式。
- 集合以接口和类的形式存在,具有封装、继承和多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。
总结
①集合弥补了数组的缺陷,它比数组更灵活更实用,可大大提高了软件的开发效率,而且不同的集合可适用于不同场合。②集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
③通常说 Java 的集合框架共有三大类接口:List,Set 和 Map,区别如下。
- Collection 接口存储一组不唯一、无序的对象。
- Set 接口继承 Collection 接口,存储一组唯一、无序的对象。
- List 接口继承 Collection 接口,存储一组不唯一、有序的对象。
- Map 接口存储一组成对的键一值对象,提供 Key 到 value 的映射。key 不要求有序、 不允许重复。value 同样不要求有序,但允许重复。
④ArrayList 和数组采用相同的存储方式,它的优点在于遍历元素和随机访问元素的效率比较高。LinkedList 采用链表存储方式,优点在于插入、删除元素时效率比较高。
⑤HashMap 是最常见的 Map 实现类,它的存储方式是哈希表,优点是查询指定元素效率高。
⑥Iterator为集合而生,专门实现集合的遍历,它隐藏了各种集合实现类的内部细节 ,提供了遍历集合的统一编程接口。
⑦使用泛型结合在创建集合对象时指定集合中元素的类型,在从集合中取出元素时无需进行类型强制转换,避免了 ClassCastException 异常。