Java的集合类由Collection接口和Map接口派生
- 集合类的接口定义
1) Collection
一组"对立"的元素,每个位置只能保存一个元素(对象),通常这些元素都服从某种规则
1.1) List必须保持元素特定的顺序
1.2) Set不能有重复元素
1.3) Queue保持一个队列(先进先出)的顺序
2) Map
一组成对的"键值对"对象,就像一个小型数据库。我们可以通过"键"找到该键对应的"值"
-
Java集合类架构层次关系
盗用一张图来展示集合接口和它的实现类直接拿的关系
android常用的集合方法和实现类
-
Iterator:迭代器
它是Java集合的顶层接口(不包括 map 系列的集合,Map接口 是 map 系列集合的顶层接口)
查看Collection源码可以看到它继承的是类 Iterable,
Iterator :存在于 java.util 包中。核心的方法
- Object next():返回迭代器刚越过的元素的引用,返回值是 Object,需要强制转换成自己需要的类型
- boolean hasNext():判断容器内是否还有可供访问的元素
- void remove():删除迭代器刚越过的元素
这里我们引用一个Iterator 的实现类 ArrayList 来看一下迭代器的使用:暂时先不管 List 集合是什么,只需要看看迭代器的用法就行了
1 //产生一个 List 集合,典型实现为 ArrayList。
2 List list = new ArrayList();
3 //添加三个元素
4 list.add("Tom");
5 list.add("Bob");
6 list.add("Marry");
7 //构造 List 的迭代器
8 Iterator it = list.iterator();
9 //通过迭代器遍历元素
10 while(it.hasNext()){
11 Object obj = it.next();
12 System.out.println(obj);
13 }
- HashMap
继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口
简单来说HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
它包括几个重要的成员变量:table, size, threshold, loadFactor, modCount。
table是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的"key-value键值对"都是存储在Entry数组中的。
size是HashMap的大小,它是HashMap保存的键值对的数量。
threshold是HashMap的阈值,用于判断是否需要调整HashMap的容量。threshold的值=“容量*加载因子”,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。
loadFactor就是加载因子。
modCount是用来实现fail-fast机制的。
Map:key-value 的键值对,key 不允许重复,value 可以
1、严格来说 Map 并不是一个集合,而是两个集合之间 的映射关系。
2、这两个集合每一条数据通过映射关系,我们可以看成是一条数据。即 Entry(key,value)。Map 可以看成是由多个 Entry 组成。
3、因为 Map 集合即没有实现于 Collection 接口,也没有实现 Iterable 接口,所以不能对 Map 集合进行 for-each 遍历。
HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。
常用的hashMap遍历:
遍历Entry
for(Map.Entry<String, String> entry: map.entrySet())
{
System.out.println("Key: "+ entry.getKey()+ " Value: "+entry.getValue());
}
根据collection的Iterator遍历,keySet源码可读
for(String key:map.keySet())
{
System.out.println("Key: "+key+" Value: "+map.get(key));
}