第七章 Collection 集合框架
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第七章 Collection 集合框架
• 掌握集合框架继承结构 • 常见集合类的使用
简介
Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操 作对象的接口组成。不同接口描述一组不同数据类型。它们都封装在 java.util包中。 图 7.1 Java集合框架图
简介
集合接口: 个接口 短虚线表示),表示不同集合类型,是集合框架的基础。 个接口( ),表示不同集合类型 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自 抽象类 定 义集合类。 实现类:8个实现类(实线表示),对接口的具体实现。 实现类 集合机构图 * Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set HashSet , TreeSet , LinkedHashSet Map ├Hashtable ├HashMap └WeakHashMap
Collection转换 转换 为Object数组 数组
Object[] toArray() Object[] toArray(Object[] a)
7.3 List
Collection<--List<--Vector Collection<--List<--ArrayList Collection<--List<--LinkedList
图 7.2 核心接口 Collection 接口是一组允许重复的对象。 接口是一组允许重复的对象。 Set 接口继承 Collection,但不 , 允许重复, 无序的)。 允许重复,使用自己内部的一个排列机制 (无序的)。 List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重 ,允许重复,以元素安插的次序来放置元素, 新排列。 新排列。 Map接口是一组成对的键-值对象,即所持有的是 接口是一组成对的键- 接口是一组成对的键 值对象,即所持有的是key-value pairs。Map中 。 中 不能有重复的key。拥有自己的内部排列机制。 不能有重复的 。拥有自己的内部排列机制。 注意: 注意: Ø 容器中的元素类型都为 容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类 。从容器取得元素时, 型。
7.1 核心接口 核心接口是集合框架独立操作的体现,它定义了集合框架的公共功能。 核心接口是集合框架独立操作的体现,它定义了集合框架的公共功能。Java集 集 合框架的核心接口有两种: 映射)。 合框架的核心接口有两种:Collection(聚集)和Map(映射 。其中 (聚集) 映射 其中Collection还 还 有两个子接口如图7.2所示: 所示: 有两个子接口如图 所示
7.2 Collection
Collection常见的方法: 常见的方法: 常见的方法 Collection不提供 不提供get()方法。如果要遍历 方法。 不提供 方法 如果要遍历Collectin中的元 中的元 就必须用Iterator。 素,就必须用 。
功能 单元素添加、 单元素添加、删 除操作
方法名 boolean add(Object o) boolean remove(Object o) int size() boolean isEmpty() boolean contains(Object o) Iterator iterator() 将对象添加给集合
描述
如果集合中有与o相匹配的对象, 如果集合中有与 相匹配的对象,则删除 相匹配的对象 对象 返回当前集合中元素的数量 判断集合中是否有任何元素 查找集合中是否含有对象o 查找集合中是否含有对象 返回一个迭代器, 返回一个迭代器,用来访问集合中的各个 元素 查找集合中是否含有集合c 查找集合中是否含有集合 中所有元素
Map myMap = Collections.synchronizedMap (myMap); List myList = Collections.synchronizedList (myList);
Java arrays are even faster than using an ArrayList/Vector and perhaps therefore may be preferable. ArrayList/Vector internally uses an array with some convenient methods like add(..), remove(…) etc.
使用两种 List 实现的哪一种取决于你特定的需要。如置插入或除去元素, 随机访问,而不必在除尾部的任何位置插入或除去元素, 那么,ArrayList 提供了可选的集合。但如果,你要频繁的 那么, 从列表的中间位置添加和除去元素,而只要顺序的访问 从列表的中间位置添加和除去元素, 列表元素,那么,LinkedList 实现更好。 列表元素,那么, 实现更好。
7.3.1 LinkedList类 LinkedList类的内部结构是线性链表,所以它适合从列表中间添 加删除元素,而随机访问元素的效率较低。LinkedList类添加了一些 处理列表两端元素的方法。
功能 添加 方法名 void addFirst(Object o) void addLast(Object o) 获取 Object getFirst() Object getLast() 删除 Object removeFirst() Object removeLast() 构建 LinkedList() LinkedList(Collection c) 描述 将对象o添加到列表的开头 将对象 添加到列表的开头 将对象o添加到列表的结尾 将对象 添加到列表的结尾 返回列表开头的元素 返回列表结尾的元素 删除并且返回列表开头的元素 删除并且返回列表结尾的元素 构建一个空的链接列表 构建一个链接列表,并且添加集合 的所 构建一个链接列表,并且添加集合c的所 有元素
方法名 void add(int index, Object element) boolean addAll(int index, Collection c) Object get(int index) int indexOf(Object o) int lastIndexOf(Object o) Object remove(int index) Object set(int index, Object element) 功能 在指定位置index上添加元素 上添加元素element 在指定位置 上添加元素 将集合c的所有元素添加到指定位置 将集合 的所有元素添加到指定位置 index 返回List中指定位置的元素 中指定位置的元素 返回 返回第一个出现元素o的位置, 返回第一个出现元素 的位置,否则返回 的位置 -1 返回最后一个出现元素o的位置, 返回最后一个出现元素 的位置,否则返 的位置 回-1 删除指定位置上的元素 用元素element取代位置 取代位置index上的元 用元素 取代位置 上的元 素,并且返回旧的元素
查询操作
组操作
boolean containsAll(Collection c) boolean addAll(Collection c) void clear() void removeAll(Collection c) void retainAll(Collection c)
将集合c 将集合 中所有元素添加给该集合 删除集合中所有元素 从集合中删除集合c 从集合中删除集合 中的所有元素 从集合中删除集合c 从集合中删除集合 中不包含的元素 返回一个内含集合所有元素的array 返回一个内含集合所有元素的 返回一个内含集合所有元素的array。运 返回一个内含集合所有元素的 。 行期返回的array和参数 的型别相同,需 和参数a的型别相同, 行期返回的 和参数 的型别相同 要转换为正确型别。 要转换为正确型别。
7.4 Iterator接口 接口 Collection 接口的 接口的iterator()方法返回一个 Iterator(迭代器)。 方法返回一个 (迭代器)。 Iterator接口方法能以迭代方式逐个访问集合中各个元素,并安全的从 接口方法能以迭代方式逐个访问集合中各个元素, 接口方法能以迭代方式逐个访问集合中各个元素 Collection 中除去适当的元素。 中除去适当的元素。
7.3.2 ArrayList类 ArrayList类封装了一个动态再分配的Object[]数组。所以 ArrayList适合随机访问内部元素,而在列表中间添加删除元素的效 率较低。ArrayList的常见方法都在List接口中。 例子: public static void main(String args[]) { // 建立空列表 ArrayList<String> list = new ArrayList<String> (); // 在列表尾部加入元素 list.add("AA"); list.add("BB"); list.add("CC"); // 通过索引遍历列表 for (int i = 0; i < list.size(); i++) { // 列表中取出的对象都是Object类型,需要强制转化 String temp = (String) list.get(i); System.out.println(temp); } }
删除
void remove()
面试题目: What is the main difference between an ArrayList and a Vector? What is the main difference between Hashmap and Hashtable?
So which is better? As a general rule, prefer ArrayList/Hashmap to Vector/Hashtable. If your application is a multithreaded application and at least one of the threads either adds or deletes an entry into the collection then use new Java collection API‘s external synchronization facility as shown below to temporarily synchronize your collections as needed:
Collection<--List<--Vector Collection<--List<--ArrayList Collection<--List<--LinkedList Collection<--Set<--HashSet Collection<--Set<--HashSet<--LinkedHashSet Collection<--Set<--SortedSet<--TreeSet Map<--SortedMap<--TreeMap Map<--HashMap
功能 遍历
方法名 boolean hasNext() Object next()
描述 判断是否存在另一个可访问的元素 返回要访问的下一个元素。如果到达集合结尾, 返回要访问的下一个元素。如果到达集合结尾,则抛出 NoSuchElementException异常 异常 删除上次访问返回的对象。 删除上次访问返回的对象。本方法必须紧跟在一个元素的 访问后执行。如果上次访问后集合已被修改, 访问后执行。如果上次访问后集合已被修改,方法将抛出 IllegalStateException
• 掌握集合框架继承结构 • 常见集合类的使用
简介
Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操 作对象的接口组成。不同接口描述一组不同数据类型。它们都封装在 java.util包中。 图 7.1 Java集合框架图
简介
集合接口: 个接口 短虚线表示),表示不同集合类型,是集合框架的基础。 个接口( ),表示不同集合类型 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自 抽象类 定 义集合类。 实现类:8个实现类(实线表示),对接口的具体实现。 实现类 集合机构图 * Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set HashSet , TreeSet , LinkedHashSet Map ├Hashtable ├HashMap └WeakHashMap
Collection转换 转换 为Object数组 数组
Object[] toArray() Object[] toArray(Object[] a)
7.3 List
Collection<--List<--Vector Collection<--List<--ArrayList Collection<--List<--LinkedList
图 7.2 核心接口 Collection 接口是一组允许重复的对象。 接口是一组允许重复的对象。 Set 接口继承 Collection,但不 , 允许重复, 无序的)。 允许重复,使用自己内部的一个排列机制 (无序的)。 List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重 ,允许重复,以元素安插的次序来放置元素, 新排列。 新排列。 Map接口是一组成对的键-值对象,即所持有的是 接口是一组成对的键- 接口是一组成对的键 值对象,即所持有的是key-value pairs。Map中 。 中 不能有重复的key。拥有自己的内部排列机制。 不能有重复的 。拥有自己的内部排列机制。 注意: 注意: Ø 容器中的元素类型都为 容器中的元素类型都为Object。从容器取得元素时,必须把它转换成原来的类 。从容器取得元素时, 型。
7.1 核心接口 核心接口是集合框架独立操作的体现,它定义了集合框架的公共功能。 核心接口是集合框架独立操作的体现,它定义了集合框架的公共功能。Java集 集 合框架的核心接口有两种: 映射)。 合框架的核心接口有两种:Collection(聚集)和Map(映射 。其中 (聚集) 映射 其中Collection还 还 有两个子接口如图7.2所示: 所示: 有两个子接口如图 所示
7.2 Collection
Collection常见的方法: 常见的方法: 常见的方法 Collection不提供 不提供get()方法。如果要遍历 方法。 不提供 方法 如果要遍历Collectin中的元 中的元 就必须用Iterator。 素,就必须用 。
功能 单元素添加、 单元素添加、删 除操作
方法名 boolean add(Object o) boolean remove(Object o) int size() boolean isEmpty() boolean contains(Object o) Iterator iterator() 将对象添加给集合
描述
如果集合中有与o相匹配的对象, 如果集合中有与 相匹配的对象,则删除 相匹配的对象 对象 返回当前集合中元素的数量 判断集合中是否有任何元素 查找集合中是否含有对象o 查找集合中是否含有对象 返回一个迭代器, 返回一个迭代器,用来访问集合中的各个 元素 查找集合中是否含有集合c 查找集合中是否含有集合 中所有元素
Map myMap = Collections.synchronizedMap (myMap); List myList = Collections.synchronizedList (myList);
Java arrays are even faster than using an ArrayList/Vector and perhaps therefore may be preferable. ArrayList/Vector internally uses an array with some convenient methods like add(..), remove(…) etc.
使用两种 List 实现的哪一种取决于你特定的需要。如置插入或除去元素, 随机访问,而不必在除尾部的任何位置插入或除去元素, 那么,ArrayList 提供了可选的集合。但如果,你要频繁的 那么, 从列表的中间位置添加和除去元素,而只要顺序的访问 从列表的中间位置添加和除去元素, 列表元素,那么,LinkedList 实现更好。 列表元素,那么, 实现更好。
7.3.1 LinkedList类 LinkedList类的内部结构是线性链表,所以它适合从列表中间添 加删除元素,而随机访问元素的效率较低。LinkedList类添加了一些 处理列表两端元素的方法。
功能 添加 方法名 void addFirst(Object o) void addLast(Object o) 获取 Object getFirst() Object getLast() 删除 Object removeFirst() Object removeLast() 构建 LinkedList() LinkedList(Collection c) 描述 将对象o添加到列表的开头 将对象 添加到列表的开头 将对象o添加到列表的结尾 将对象 添加到列表的结尾 返回列表开头的元素 返回列表结尾的元素 删除并且返回列表开头的元素 删除并且返回列表结尾的元素 构建一个空的链接列表 构建一个链接列表,并且添加集合 的所 构建一个链接列表,并且添加集合c的所 有元素
方法名 void add(int index, Object element) boolean addAll(int index, Collection c) Object get(int index) int indexOf(Object o) int lastIndexOf(Object o) Object remove(int index) Object set(int index, Object element) 功能 在指定位置index上添加元素 上添加元素element 在指定位置 上添加元素 将集合c的所有元素添加到指定位置 将集合 的所有元素添加到指定位置 index 返回List中指定位置的元素 中指定位置的元素 返回 返回第一个出现元素o的位置, 返回第一个出现元素 的位置,否则返回 的位置 -1 返回最后一个出现元素o的位置, 返回最后一个出现元素 的位置,否则返 的位置 回-1 删除指定位置上的元素 用元素element取代位置 取代位置index上的元 用元素 取代位置 上的元 素,并且返回旧的元素
查询操作
组操作
boolean containsAll(Collection c) boolean addAll(Collection c) void clear() void removeAll(Collection c) void retainAll(Collection c)
将集合c 将集合 中所有元素添加给该集合 删除集合中所有元素 从集合中删除集合c 从集合中删除集合 中的所有元素 从集合中删除集合c 从集合中删除集合 中不包含的元素 返回一个内含集合所有元素的array 返回一个内含集合所有元素的 返回一个内含集合所有元素的array。运 返回一个内含集合所有元素的 。 行期返回的array和参数 的型别相同,需 和参数a的型别相同, 行期返回的 和参数 的型别相同 要转换为正确型别。 要转换为正确型别。
7.4 Iterator接口 接口 Collection 接口的 接口的iterator()方法返回一个 Iterator(迭代器)。 方法返回一个 (迭代器)。 Iterator接口方法能以迭代方式逐个访问集合中各个元素,并安全的从 接口方法能以迭代方式逐个访问集合中各个元素, 接口方法能以迭代方式逐个访问集合中各个元素 Collection 中除去适当的元素。 中除去适当的元素。
7.3.2 ArrayList类 ArrayList类封装了一个动态再分配的Object[]数组。所以 ArrayList适合随机访问内部元素,而在列表中间添加删除元素的效 率较低。ArrayList的常见方法都在List接口中。 例子: public static void main(String args[]) { // 建立空列表 ArrayList<String> list = new ArrayList<String> (); // 在列表尾部加入元素 list.add("AA"); list.add("BB"); list.add("CC"); // 通过索引遍历列表 for (int i = 0; i < list.size(); i++) { // 列表中取出的对象都是Object类型,需要强制转化 String temp = (String) list.get(i); System.out.println(temp); } }
删除
void remove()
面试题目: What is the main difference between an ArrayList and a Vector? What is the main difference between Hashmap and Hashtable?
So which is better? As a general rule, prefer ArrayList/Hashmap to Vector/Hashtable. If your application is a multithreaded application and at least one of the threads either adds or deletes an entry into the collection then use new Java collection API‘s external synchronization facility as shown below to temporarily synchronize your collections as needed:
Collection<--List<--Vector Collection<--List<--ArrayList Collection<--List<--LinkedList Collection<--Set<--HashSet Collection<--Set<--HashSet<--LinkedHashSet Collection<--Set<--SortedSet<--TreeSet Map<--SortedMap<--TreeMap Map<--HashMap
功能 遍历
方法名 boolean hasNext() Object next()
描述 判断是否存在另一个可访问的元素 返回要访问的下一个元素。如果到达集合结尾, 返回要访问的下一个元素。如果到达集合结尾,则抛出 NoSuchElementException异常 异常 删除上次访问返回的对象。 删除上次访问返回的对象。本方法必须紧跟在一个元素的 访问后执行。如果上次访问后集合已被修改, 访问后执行。如果上次访问后集合已被修改,方法将抛出 IllegalStateException