10.1 集合类概述
10.2 Collection接口
10.3 List集合
(1)List接口
(2)
List 接口的实现类
List 接口不能直接被实例化。
ArrayList 类实现了可变的数组,允许保存所有元素,包括 null,并可以根据索引位置对集合进行快速的随机访问;缺点是向指定的索引位置插入对象或删除对象的速度较慢。
LinkedList 类采用链表结构保存对象。这种结构的优点是便于向集合中插入和删除对象,需要向集合中插入、删除对象时,使用 LinkedList 类实现的 List 集合的效率较高;但对于随机访问集合中的对象,使用 LinkedList 类实现 List 集合的效率较低。
例:
package ten01;
import java.util.*; //导入java.util包
public class UseList { // 创建类useList
public static void main(String[] args) { // 主方法
List<String> list = new ArrayList<>(); // 创建集合对象
// 向集合添加元素
list.add("a");
list.add("b");
list.add("c");
int i = (int) (Math.random() * list.size()); // 获得0~2之间的随机数
System.out.println("随机获取数组中的元素:" + list.get(i));
list.remove(2); // 将指定索引位置的元素从集合中移除
System.out.println("将索引是'2'的元素从数组移除后,数组中的元素是:");
for (int j = 0; j < list.size(); j++) { // 循环遍历集合
System.out.println(list.get(j)); // 获取指定索引处的值
}
}
}
运行结果如下:
(3)Iterator 迭代器
在java.util 包中提供了一个 Iterator 接口,该接口是一个专门对 Collection 进行迭代的迭代器。
lterator迭代器的常用方法
方法 | 功能描述 |
hasNext() | 如果仍有元素可以迭代,则返回 true |
next() | 返回迭代的下一个元素 |
remove() | 从迭代器指向的Collection中移除迭代器返回的最后一个元素(可选操作) |
注意:
Iterator的next()方法返回的是Object。
例:
package ten02;
import java.util.*; //导入java.util包,其他实例都要添加该语句
public class UseIterator { // 创建类useIterator
public static void main(String args[]) {
Collection<String> list = new ArrayList<>(); // 实例化集合类对象
// 向集合添加数据
list.add("a");
list.add("b");
list.add("c");
Iterator<String> it = list.iterator(); // 创建迭代器
while (it.hasNext()) { // 判断是否有下一个元素
String str = (String) it.next(); // 获取集合中元素
System.out.println(str);
}
}
}
运行结果如下:
10.4 Set 集合
Set 集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但 Set 集合中不能包含重复对象。Set 集合由 Set 接口和 Set 接口的实现类组成。
1.Set 接口
Set 接口继承了 Collection 接口,因此包含 Collection 接口的所有方法。
2.Set 接口的实现类
Set 接口常用的实现类有 HashSet 与 TreeSet。
HashSet 类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 Set 的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用 null 元素。该类实现了 Set 接口,不允许出现重复元素,不保证集合中元素的顺序,允许包含值为 null 的元素,但最多只能一个。
TreeSet 类不仅实现了 Set 接口,还实现了 java.util.SortedSet 接口,因此,TreeSet 类实现的 Set 集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对用 TreeSet 类实现的 Set 集合中的对象进行排序。该类实现了Set接口,可以实现排序等功能。
方法 | 功能描述 |
first() | 返回此 Set中当前第一个 (最低)元素 |
last() | 返回此 Set 中当前最后一 个(最高)元素 |
comparator() | 返回对此 Set 中的元素进 行排序的比较器。如果此 Set使用自然顺序,则返回 null |
headSet(E toElement) | 返回一个新的 Set集合,新集合是toElement(不包含)之前的所有对象 |
subSet(E fromElement, E fromElement) | 返回一个新的 Set集合,是fromElement(包含)对象与fromElement(不包含)对象 之间的所有对象 |
tailSet(E fromElement) | 返回一个新的 Set集合,新集合包含对象fromElement(包含)之后的所有对象 |
例:
package ten03;
import java.util.*;
public class UseHashSet {
public static void main(String[] args) {
Set set = new HashSet();// 创建Set集合
set.add("a");// 向集合中添加数据
set.add("b");
set.add("c");
set.add("c");
Iterator<String> it = set.iterator();// 创建迭代器
while (it.hasNext()) {// 遍历HashSet集合
String str = (String) it.next();// 获取集合中的元素
System.out.println(str);
}
}
}
运行结果如下:
10.5 Map 集合
Map 集合没有继承 Collection 接口,其提供的是 key 到 value 的映射。Map 中不能包含相同的 key,每个 key 只能映射一个 value。key 还决定了存储对象在映射中的存储位置,但不是由 key 对象本身决定的,而是通过一种“散列技术”进行处理,产生一个散列码的整数值。散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始位置,从而确定存储对象在映射中的存储位置。Map 集合包括Map 接口以及 Map 接口的所有实现类。
1.Map 接口
2.Map 接口的实现类
Map 接口常用的实现类有 HashMap 和 TreeMap。
HashMap 类是基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键,但必须保证键的唯一性。HashMap 通过哈希表对其内部的映射关系进行快速查找。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。HashMap 继承于 AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
TreeMap 类不仅实现了 Map 接口,还实现了 java.util.SortedMap 接口,因此,集合中的映射关系具有一定的顺序。但在添加、删除和定位映射关系时,TreeMap 类比 HashMap 类性能稍差。由于 TreeMap 类实现的 Map 集合中的映射关系是根据键对象按照一定的顺序排列的,因此不允许键对象是 null。
例:
package ten04;
import java.util.*;
public class UseHashMap {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>(); // 创建Map实例
map.put("ISBN-978654", "Java从入门到精通"); // 向集合中添加对象
map.put("ISBN-978361", "Android从入门到精通");
map.put("ISBN-978893", "21天学Android");
map.put("ISBN-978756", "21天学Java");
Set<String> set = map.keySet(); // 构建Map集合中所有key对象的集合
Iterator<String> it = set.iterator(); // 创建集合迭代器
System.out.println("key值:");
while (it.hasNext()) { // 遍历集合
System.out.print(it.next()+"\t");
}
Collection<String> coll = map.values(); // 构建Map集合中所有values值集合
it = coll.iterator();
System.out.println("\nvalues值:");
while (it.hasNext()) { // 遍历集合
System.out.print(it.next()+"\t");
}
}
}
运行结果如下:
10.6 集合的使用场合
List集合、Set集合和Map集合,那么在实际开发中,应该选用合适的集合。
List 集合关注的是索引,其元素是顺序存放的,例到如一个班的学生成绩,成绩可以重复就可以使用List集合存取。
Set集合关注唯一性,它的值不允许重复,例如每个班的学生的学号,每个学生的学号是不能重复的。
Map集合关注的是唯一的标识符(KEY),它将唯一的键映射到某个元素,例如每个班学生的学号与姓名的映射,每个学号对应一个学生的姓名,学号是不能重复的,但是学生的姓名有可能重复。