简介
Java 中的集合大致上,可以分为如下4种体系:
- Set: 代表无序、不可重复的集合。
- List:代表有序、可重复集合。
- Map:代表具有映射关系的集合。
- Queue:从 JDK 1.5 以后增加的一种体系集合,代表一种队列集合实现。
框架概述
集合框架如图:
对于以上的框架图有如下几点说明:
- 所有集合类都位于
java.util
包下。Java 的集合类主要由两个接口派生而出:Collection 和 Map,Collection 和 Map 是 Java 集合框架的根接口,这两个接口又包含了一些子接口或实现类。 - 集合接口:6个接口(短虚线表示),表示不同集合类型,是集合框架的基础。
- 抽象类:5个抽象类(长虚线表示),对集合接口的部分实现。可扩展为自定义集合类。
- 实现类:8个实现类(实线表示),对接口的具体实现。
- Collection 接口是一组允许重复的对象。
- Set 接口继承 Collection,集合元素不重复。
- List 接口继承 Collection,允许重复,维护元素插入顺序。
- Map接口是键-值对象,与Collection接口没有什么关系。
- Set、List和Map可以看做集合的三大类:
List 集合
是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set 集合
是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是集合里元素不允许重复的原因)。
Map 集合
中保存 Key-value 对形式的元素,访问时只能根据每项元素的 key 来访问其 value 。 - Collections 与 Arrays 是两个工具类。
具体分析
框架图:
分析几点说明:
上面的框架图中可以看到 Collection 与 Map 是整个图的两条主干。
Collection:
- Collection 是一个接口,包含集合的基本操作和属性。Collection 包含了 List 和 Set 两大分支。
- List 是一个有序的队列,每一个元素都有它的索引。第一个元素的索引值是 0。List 的实现类有 LinkedList,ArrayList, Vector, Stack。
- Set 是一个不允许有重复元素的集合。Set 的实现类有 HastSet 和 TreeSet。HashSet 依赖于 HashMap,它实际上是通过 HashMap 实现的;TreeSet 依赖于 TreeMap,它实际上是通过 TreeMap 实现的。
ArrayList 与 Vector 的区别:
No. | 区别 | ArrayList | Vector |
---|---|---|---|
1 | 推出时间 | JDK1.2(new) | JDK1.0(old) |
2 | 性能 | 异步处理 | 同步处理 |
3 | 数据安全 | 非线程安全 | 线程安全 |
4 | 输出 | Iterator,ListIterator,foreach | Iterator,ListIterator,foreach,Enumeration |
Map:
Map是一个映射接口,即 key-value 键值对。Map 中的每一个元素包含 “一个key ”和 “key对应的value” 。AbstractMap是个抽象类,它实现了 Map 接口中的大部分 API。而 HashMap,TreeMap,WeakHashMap 都是继承于 AbstractMap。Hashtable 虽然继承于 Dictionary,但它实现了Map接口。
Hash 表
Hash 表是一种数据结构,用于查找对象。Hash 表为每个对象计算出一个整数,称为 Hash Code(哈希码)。Hash 表是各链接式列表的阵列。每个列表称为一个 buckets(哈希表元)。对象位置的算式为 index = HashCode % buckets
。其中 HashCode 表示对象哈希码,buckets 表示哈希表元总数。
当我们添加元素时,有时会遇到已经填充了元素的哈希表元,这种情况称为 Hash Collisions(哈希冲突),这时必须要判断该元素是否已经存在于该哈希表中。
Collections 简单操作
为集合追加数据:public static boolean addAll(Collection<? super T>c,T…elements);
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class CollectionsDemo {
public static void main(String[] args) throws Exception {
List<String> all = new ArrayList<>();
all.add("A");
all.add("B");
all.add("C");
all.add("D");
Collections.addAll(all, "java", "Oracle");
System.out.println(all);
System.out.println("逆序输出:");
Collections.reverse(all);
System.out.println(all);
}
}
Collection 与 Collections 的区别
请解释 Collection 与 Collections 的区别:
- Collection 是集合操作的接口
- Collections 是集合操作的工具类,可以进行 List、Set、Map 集合的操作
Iterator 接口
Iterator 主要用于遍历(即迭代访问)Collection 集合中的元素,Iterator 对象也被称为迭代器。Iterator 接口隐藏了各种 Collection 实现类的底层细节,向应用程序提供了遍历 Collection 集合元素的统一API。常用的有入下面几个方法:
- boolean hasNext() :如果被迭代的集合元素没有被遍历完,返回 true。
- Object next():返回集合里的下一个元素。
- void remove() : 删除集合里上一次 next 方法返回的元素。
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("壹", 1);
map.put("贰", 2);
map.put("叄", 3);
map.put(null, 0);
// 通过 keySet() 来获取 key 的 Set 集合
Set<String> all = map.keySet();
// 使用 iterator 迭代
Iterator<String> iter = all.iterator();
while (iter.hasNext()) {
System.out.println(iter.next()); // 贰 null 叄 壹
}
}
}