标题:
Map、Set、Iterator迭代详解与Java平台的集合框架
[打印本页]
作者:
qingqing3721
时间:
2011-8-8 00:17
标题:
Map、Set、Iterator迭代详解与Java平台的集合框架
Map、Set、Iterator迭代详解
Map接口定义了四种类型的方法,每个Map都包括这些方法。
equals(Object o)比较指定对象与此Map的等价性。
hashCode()返回此Map的哈希码。
Map定义了几个用于插放和删除元素的变换方法。
remove(Object key) 从Map中删除键和关联的值。
put(object key,Object value) 将指定值与指定键相关联。
clear() 从Map虽删除一切映射。
putAll(Map t) 将指定Map中的一切映射复制到此Map。
检查Map
迭代Map中的元素不存在直接了当的方法。假设要查询某个Map以了解其哪些元素满足特定查询或假设要迭代其一切元素,则您首先需求获取该Map的“视图”。有三种可能的视图:一切
键值对、一切键、一切值。前两个视图均返回Set对象,第三个视图返回Collection对象。就这两种状况而言,效果到这里并没有结束,这是由于您无法直接迭代Collection对象或Set对
象。要进行迭代,您必须获得一个Iterator对象。因此要迭代Map的元素,必须进行如下编码:
Iterator keyValuePairs = aMap.entrySet().iterator();
Iterator keys=aMap.keySet().iterator();
Iterator values=aMap.values().iterator();
值得注意的是,这些对象实际上是根底Map的视图,而不是包括一切元素的正本。
运用Iterator对象,您可以遍历Map的元素,还可以删除Map中的元素。
EnterySet()返回Map中所包括映射的Set视图。Set中的每个元素都是一个Map.Entry对象,可以运用getKey()和getValue()方法拜访后者的键元素和值元素。
keySet()返回Map中所包括键的Set视图。删除Set中的元素还将删除Map中相应原映射。
values()返回Map中所包括值的Collection视图。删除Collection中的元素还将删除Map中相应的映射
Map拜访和测试方法:
get(Object key) 返回与指定键关联的值
containsKey(Object key) 假设Map包括指定键的映射,则返回True
isEmpty() 假设Map不包括键-值映射,则返回True
size() 返回Map中的键值映射的数目。
Set(interface):存入Set的每个元素必须是独一的,由于Set不保管重复元素。参加Set的Object必须定义equals()方法以确保对象的独一性。
Set与Collection有完全一样的接口。Set接口不保证维护元素的次第。
迭代器是一种设计形式,它是一个对象,它可以遍历并选择序列中的对象,而开人员不需求了解该序列的底层构造。迭代器通常被称为“轻量级”对象,由于创立它的代价小。
Java中的Iterator功用比较简单,并且只能单向移动:运用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。运用next()获得序列中的
下一个元素。运用hasNext()检查序列中是否还有元素。运用remove()将迭代器新返回的元素删除。
Java平台的集合框架
“集合框架”主要由一组用来操作对象的接口组成。不同接口描画一组不同数据类型。
集合接口:6个接口,表示不同集合类型,是集合框架的根底。
笼统类:5个笼统类,对集合接口的局部实现。可扩展为自定义集合类。
实现类:8个实现类,对接口的详细实现。
在很大程度上,一旦您了解了接口,您就了解了框架。虽然您总要创立接口特定的实现,但拜访实际集合的方法应该限制在接口方法的运用上;
因此,允许您更基本的数据构造而不用改动其它代码。
Collection接口是一组允许重复的对象。
Set接口继承Collection,但不允许重复,运用自己外部的排列机制。
List接口继承Collection,允许重复,以元素安插的次第来放置元素,不会重新排列。
Map接口是一组成对的键-值对象。Map中不能有重复的Key.拥有自己的外部排列机制。
容器中的元素类型都为Object。从容器获得元素时,必须把它转换成原来的类型。
集合接口:
Collection接口:用于表示任何对象或元素组。想要尽可能以惯例方式处理一组元素时,就运用这一接口。
1、单元素添加、删除操作:
Boolean add(Object o):将对象添加到集合
Boolean remove (Object o):假设集体中有与O相匹配的对象,则删除对象O。
2、查询操作:
Int size():返回以后集合中元素的数量
Boolean isEmpty():判别集合中是否有任何元素。
Boolean contains(Object o):查找集合中是否否有对象O
Iterator iterator():返回一个迭代器,用来拜访集合中的各个元素。
3、组操作:作用于元素组或整个集合
Boolean containsAll(Collection c):查找集合中是否含有集合C中一切元素
Boolean addAll(Collection c):将集合C中一切元素添加到该集合。
Void clear():删除集合中一切元素。
Void removeAll(Collection c):从集合中删除集合C中的一切元素。
Void retainAll(Collection c):从集合中删除集合C中不包括的元素
4、Collection转换为Object数组:
Object[] toArray():返回一个内含集合一切元素的Array
Object[] toArray(Object[] a):返回一个内含集合一切元素的Array.运行期返回的Array和参数A的型别相反,需求转换为正确型别。
此外,您还可以把集合转换成其它任何其它的对象数组。但是,您不能直接把集合转换成基本数据类型的数组,由于集合必须持有对象。Collection不提供get()方法。假设要遍历
Collection中的元素,就必须用Iterator.
AbstractCollection笼统类
AbstactCollection类提供详细“集合框架”类的基本功用。虽然您可以自实现Collection接口的所无方法,但是,除了Iterator()和Size()方法在恰当的子类中实现以外,其它所无方法都由
AbstractCollection类来提供实现。假设子类不掩盖某些方法,可选的方法将抛出异常。
Iterator接口
Collection接口的Iterator()方法返回一个Iterator。Iterator接口方法能以迭代方式逐一拜访集合中各个元素,并平安的从Collection中除去适当的元素。
1、Boolean hasNext():判别是否存在另一个可拜访的元素。
2、Object next():返回要拜访的下一个元素。假设到达集合结尾,则抛出NoSuchElementException异常。
3、Void remove():删除上次拜访返回的对象。本方法必须紧跟在一个元素的拜访后执行。假设上次拜访后集合已被修正,方法将抛出
IIIegalStateException。
Iterator中删除操作对底层Collection也有影响。
迭代器是故障快速修复的。这意味着,当另一个线程修正底层集合的时分,假设您正在用Iterator遍历集合,那么,Iterator就会抛出
ConcurrentModificationException异常并立刻失败。
List接口继承了Collection接口以定义一个允许重复项的有序集合。该接口不但能够对列表的一局部进行处理,还添加了面向地位的操作。
1、面向地位的操作包括插入某个元素,还包括获取、除去或更改元素的功用。在List中搜索元素可以从列表的头部或尾部开始,假设找到元素,还将报告元素所在的地位:
Void add(int index,Object element):在指定地位Index上添加元素element
Boolean addAll(int index,Collection c):将集合C的一切元素添加到指定地位Index
Object get(int index):返回List中指定地位的元素
Int indexOf(Object o):返回第一个呈现元素O的地位,否则返回-1
Int lastIndexOf(Object o):返回最后一个呈现元素O的地位,否则返回-1
Object remove(int index):删除指定地位上的元素
Object set(int index,Object element):用元素Element取代地位Index上的元素,并且返回旧的元素
2、List接口不但以地位序列迭代的遍历整个列表,还能处理集合的子集:
ListIterator ListIterator():返回一个列表迭代器,用来拜访列表中的元素
ListIterator ListIterator(int index):返回一个列表迭代器,用来从指定地位Index开始拜访列表中的元素
List subList(int formIndex,int toIndex):返回从指定地位FromIndex(包括)到ToIndex(不包括)范围中各个元素的列表视图对子列表的更改对底层List也有影响。
ListIterator接口继承Iterator接口以支持添加或更改底层集体中的元素,还支持双向拜访。ListIterator没有以后地位,光标位于调用
Previous和Next方法返回的值之间。一个长度为N的列表,有N+1个有效索引值:
1、Void add(Object o):将对象O添加到以后地位的前面
Void set(Object o):用对象O替代Next或Previous方法拜访的上一个元素。假设上次调用后列表构造被修正了,那么将抛出IIIegalStateException异常。
2、Boolean hasPrevious():判别向后迭代时是否有元素可拜访
Object previous():返回上一个对象
Int nextIndex():返回下次调用Next方法时将返回的元素的索引
Int previousIndex():返回下次调用Previous方法时将返回的元素的索引
有两个笼统的List实现类:AbstractList和AbstractSequentialList。它们掩盖了Equals()和HashCode()方法以确保两个相等的集合返回相反的哈希码。
在“集合框架”中有两种惯例的List实现:ArrayList和LinkedList。假设要支持随机拜访,而不用在除尾部的任何地位插入或除去元素,那么,ArrayList提供了可选的集合。但假设,您要
频繁的从列表的中间地位添加和除去元素,而只需顺序的拜访列表元素,那么,LinkedList实现更好。
ArrayList和LinkedList都实现Cloneable接口,都提供了两个构造函数,一个无参的,一个接受另一个Collection。
LinkedList类添加了一些处理列表两端元素的方法。
1、Void addFirst(Object o):将对象O添加到列表的扫尾。
Void addLast(Object o):将对象O添加到列表的结尾
2、Object getFirst():返回列表开关的元素
Object getLast():返回列表结尾的元素
3、Object removeFirst():删除并且返回列表开关的元素
Object removeLast():删除并且返回列表结尾的元素
4、LinkedList():构建一个空的链接列表
Linked(Collection c):构建一个链接列表,并且添加集合C的一切元素运用这些新方法,您就可以轻松的把LinkedList当作一个堆栈、队列或其它面向端点的数据构造
ArrayList类封装了一个动态再分配的Object[]数组。每个ArrayList对象有一个Capacity。这个Capacity表示存储列表中元素的数组的容量。当元素添加到ArrayList时,它的Capacity在常量
时间内自动添加。在向一个ArrayList对象添加大量元素的程序中,可运用ensureCapacity方法添加Capacity.这可以增加添加重分配的数量。
1、Void ensureCapacity(int minCapacity):将ArrayList对象容量添加MinCapacity
2、Void trimToSize():整理ArrayList对象容量为列表以后大小。程序可运用这个操作增加ArrayList对象存储空间。
Set接口继承Collection接口,而且它不允许集合中存在重复项,每个详细的Set实现类依赖添加的对象的Equals()方法来检查狂性。Set接口没有引入新方法,所以Set就是一个
Collection,只不过其行为不同。
Hash表是一种数据构造,用来查找对象。Hash表为每个对象计算出一个整数,称为Hash Code(哈希码)。Hash表是个链接式列表的阵列。每个列表称为一个Buckets(哈希表元)。
对象地位的计算Index=HashCode%buckets。
在“集合框架”中有两种比较接口:Comparable接口和Comparator接口。像String和Integer等Java内建类实现Comparable接口以提供一定排序方式,但这样只能实现该接口一次。对
于那些没有实现Comparable接口的类、或许自定义的类,您可以经过Comparator接口来定义您自己的比较方式。
在Java.lang包中,Comparable接口适用于一个类有自然顺序的时分。假定对象集合是同一个类型,该接口允许您把集合排序成自然顺序。
Int compareTo(Object o):比较以后实例对象与对象O,假设位于对象O之前,返回负值,假设两个对象在排序中地位相反,则返回0,假设位于对象O前面,则返回正值。
SortedSet,它坚持元素的有序顺序。SortedSet接口为集合的视图和它的两端提供了拜访方法。当佻处理列表的子集时,理性视图会反映到源集。此外,更改源集也会反映在子集上。发
生这种状况的缘由在于视图由两端的元素而不是下标元素指定,所以假设您想要一个特殊的高端元素在子集中,您必须找到下一个元素。添加到SortedSet实现类的元素必须实现
Comparable接口,否则您必须给它的构造函数提供一个接口的实现。TreeSet类是它的唯逐一分实现。
1、Comparator comparator():返回对元素进行排序时运用的比较器,假设运用Comparable接口的compareTo()方法对元素进行比较,则返回Null。
2、Object first():返回有序集合中第一个元素。
3、Object last():返回有序集合中最后一个元素。
4、SortedSet subSet(Object fromElement,Object toElement):返回从formElement到ToElement范围内元素的SortedSet视图。
5、SortedSet headSet(Object toElemtn):返回SortedSet的一个视图,其内各元素皆小于Toelement
6、SortedSet tailSet(Object fromElement):返回SortedSet的一个视图,其内各元素皆大于或等于FromElement
AbstractSet类掩盖了Object类的equals()和hashCode()方法,以确保两个相等的集返回相反的哈希码。若两个集大小相等且包括相反元素,则这两个集相等。按定义,集的哈希码是集中
元素哈希码的总和。因此,不管集的外部顺序如何,两个相等的集合有相反的哈希码。
Object类
1、Boolean equals(Object obj):对两个对象进行比较,以便确定它们是否相反
2、Int hashCode():返回该对象的哈希码。相反的对象必须返回相反的哈希码
“集合框架”支持Set接口两种普通的实现:HashSet和TreeSet。HashSet存储重复自在的集合。当您要从集合中以有序的方式插入和抽取元素时,TreeSet实现会有用途。为了能顺利进
行,添加到TreeSet的元素必须是可排序的。
HashSet类
1、HashSet():构建一个空的哈希集
2、HashSet(Collection c):构建一个哈希集,并且添加集合C中一切元素
3、HashSet(int initialCapacity):构建一个拥有特定容量的空哈希集
4、HashSet(int initialCapacity,float loadFactor):构建一个拥有特定容量和加载因子的空哈希集。LoadFactor是0至1之间的一个数
TreeSet类
1、TreeSet():构建一个空的树集
2、TreeSet(Collection c):构建一个树集,并且添加集合C中一切元素
3、TreeSet(Comparator c):构建一个树集,并且运用特定的比较器对其元素进行排序
4、TreeSet(SortedSet S):构建一个树集,添加有序集合S中一切元素,并且运用与有序集合S相反的比较器排序。
LinkedHashSet的迭代器按照元素的插入顺序来拜访各个元素。它提供了一个可以快速拜访各个元素的有序集合。同时,它也添加了实现的代价,由于哈希表元中的各个元素是经过双重
链接式列表链接在的。
1、LinkedHashSet():构建一个空的链接式哈希集
2、LinkedHashSet(Collection c):构建一个链接式哈希集,并且添加集合C中一切元素
3、LinkedHashSet(int initialCapacity):构建一个拥有特定容量的空链接式哈希集
4、LinkedHashSet(int initialCapacity,float loadFactor):构建一个拥有特定容量和加载因子的空链接式哈希集。LoadFactor是0至1之间的一个数。
Map接口用于维护键/值对。该接口描画了从不重复的键到值的映射
1、添加、删除操作
Object put(Object key,Object value):将互相关联的一个关键字与一个值放入该映像。假设该关键字曾经存在,那么与此关键字相关的新值
将取代旧值。方法返回关键字的旧值,假设关键字原先并不存在,则返回Null
Object remove(Object key):从映像中删除与Key相关的映射
Void putAll(Map t):将来自特定映像的一切元素添加到该映像
Void clear():从映像中删除一切映射
2、查询操作:
Object get(Object key):获得与关键字Key相关的值,并且返回与关键字Key相关的对象,假设没有在该映像中找到该关键字,则返回Null
Boolean containsKey(Object key):判别映像中是否存在关键字Key
Boolean containsValue(Object value):判别映像中是否存在值Value
Int size():返回以后映像中映射的数量
Boolean isEmpty():判别映像中是否有任何映射
3、视图操作:处理映像中键/值对组
Set keySet():返回映像中一切关键字的视图集
Collection values():返回映像中一切值的视图集
Set entrySet():返回Map.Entry对象的视图集,即映像中的关键字/值对
Map的entrySet()方法返回一个实现Map.Entry接口的对象集合。集合中每个对象都是底层Map中一个特定的键/值对。经过这个集合的迭代器,您可以获得每一个条目的键或值并对值进行更
改。当条目经过迭代器返回后,除非是迭代器自身的remove()方法或许迭代器返回的条目的setValue()方法,其他对源Map外部的修正都会导致此条目集变得有效,同时发生条目行为未定
义。
Object getKey():返回条目的关键字
Object getValue():返回条目的值
Obect setValue(Object value):将相关映像中的值改为value,并且返回旧值。
“集合框架”提供了个特殊的Map接口:SortedMap,它用来坚持键的有序顺序。SortedMap接口为映像的视图(子集),包括两个端点提供了拜访方法。除了排序是作用于映射的键以
外,处理SortedMap和处理SortedSet一样。添加到SortedMap实现类的元素必须实现Comparable接口,否则您必须给它的构造函数提供一个Comparator接口的实现。TreeMap类是它的
唯逐一份实现。
“由于关于映射来说,每个键只能对应一个值,假设在添加一个键/值对时比较两个键发生了0返回值(经过Comparable的compareTo()方法或经过Comparator的compare()方法),
那么,原始键对应值被新的值替代。假设两个元素相等,那还好。但假设不相等,那么您就应该修正比较方法,让比较方法和 equals() 的效果一致。”
(1) Comparator comparator(): 返回对关键字进行排序时运用的比较器,假设运用Comparable接口的compareTo()方法对关键字进行比较,则返回null
(2) Object firstKey(): 返回映像中第一个(最低)关键字
(3) Object lastKey(): 返回映像中最后一个(最高)关键字
(4) SortedMap subMap(Object fromKey, Object toKey): 返回从fromKey(包括)至toKey(不包括)范围内元素的SortedMap视图(子集)
(5) SortedMap headMap(Object toKey): 返回SortedMap的一个视图,其内各元素的key皆小于toKey
(6) SortedSet tailMap(Object fromKey): 返回SortedMap的一个视图,其内各元素的key皆大于或等于fromKey
4.3. AbstractMap笼统类
和其它笼统集合实现相似,AbstractMap 类掩盖了equals()和hashCode()方法以确保两个相等映射返回相反的哈希码。假设两个映射大小相等、包括同样的键且每个键在这两个映射
中对应的值都相反,则这两个映射相等。映射的哈希码是映射元素哈希码的总和,其中每个元素是Map.Entry接口的一个实现。因此,不管映射外部顺序如何,两个相等映射会报告相反的
哈希码。
4.4. HashMap类和TreeMap类
“集合框架”提供两种惯例的Map实现:HashMap和TreeMap (TreeMap实现SortedMap接口)。在Map 中插入、删除和定位元素,HashMap 是最好的选择。但假设您要按自然顺序
或自定义顺序遍历键,那么TreeMap会更好。运用HashMap要求添加的键类明确定义了hashCode()和equals()的实现。
这个TreeMap没有调优选项,由于该树总处于平衡状态。
4.4.1. HashMap类
为了优化HashMap空间的运用,您可以调优初始容量和负载因子。
(1) HashMap(): 构建一个空的哈希映像
(2) HashMap(Map m): 构建一个哈希映像,并且添加映像m的一切映射
(3) HashMap(int initialCapacity): 构建一个拥有特定容量的空的哈希映像
(4) HashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的哈希映像
4.4.2. TreeMap类
TreeMap没有调优选项,由于该树总处于平衡状态。
(1) TreeMap():构建一个空的映像树
(2) TreeMap(Map m): 构建一个映像树,并且添加映像m中一切元素
(3) TreeMap(Comparator c): 构建一个映像树,并且运用特定的比较器对关键字进行排序
(4) TreeMap(SortedMap s): 构建一个映像树,添加映像树s中一切映射,并且运用与有序映像s相反的比较器排序
4.5. LinkedHashMap类
LinkedHashMap扩展HashMap,以插入顺序将关键字/值对添加进链接哈希映像中。象LinkedHashSet一样,LinkedHashMap外部也采用双重链接式列表。
(1) LinkedHashMap(): 构建一个空链接哈希映像
(2) LinkedHashMap(Map m): 构建一个链接哈希映像,并且添加映像m中一切映射
(3) LinkedHashMap(int initialCapacity): 构建一个拥有特定容量的空的链接哈希映像
(4) LinkedHashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的链接哈希映像
(5) LinkedHashMap(int initialCapacity, float loadFactor,
boolean accessOrder): 构建一个拥有特定容量、加载因子和拜访顺序排序的空的链接哈希映像
“假设将accessOrder设置为true,那么链接哈希映像将运用拜访顺序而不是插入顺序来迭代各个映像。每次调用get或许put方法时,相关的映射便从它的以后地位上删除,然后放到链
接式映像列表的结尾处(只有链接式映像列表中的地位才会受到影响,哈希表元则不受影响。哈希表映射总是待在对应于关键字的哈希码的哈希表元中)。”
“该特性关于实现高速缓存的“删除最近最少运用”的原则很有用。例如,你可以希望将最常拜访的映射保管在内存中,并且从数据库中读取不经常拜访的对象。当你在表中找不到
某个映射,并且该表中的映射曾经放得十分满时,你可以让迭代器进入该表,将它枚举的扫尾几个映射删除掉。这些是最近最少运用的映射。”
(6) protected boolean removeEldestEntry(Map.Entry eldest): 假设你想删除最老的映射,则掩盖该方法,以便返回true。当某个映射曾经添加给映像之后,便调用该方法。它的默认
实现方法返回false,表示默认条件下老的映射没有被删除。但是你可以重新定义本方法,以便有选择地在最老的映射契合某个条件,或许映像超过了某个大小时,返回true。
4.6. WeakHashMap类
WeakHashMap是Map的一个特殊实现,
搜奇乐
它运用WeakReference(弱援用)来寄存哈希表关键字。运用这种方式时,当映射的键在 WeakHashMap的外部不再被援用时,垃圾收集器会
将它回收,但它将把到达该对象的弱援用归入一个队列。WeakHashMap的运行将活期检查该队列,以便找出新到达的弱应用。当一个弱援用到达该队列时,就表示关键字不再被任何人
运用,并且它曾经被收集起来。然后WeakHashMap便删除相关的映射。
(1) WeakHashMap(): 构建一个空弱哈希映像
(2) WeakHashMap(Map t): 构建一个弱哈希映像,并且添加映像t中一切映射
(3) WeakHashMap(int initialCapacity): 构建一个拥有特定容量的空的弱哈希映像
(4) WeakHashMap(int initialCapacity, float loadFactor): 构建一个拥有特定容量和加载因子的空的弱哈希映像
4.6. IdentityHashMap类
IdentityHashMap也是Map的一个特殊实现。在这个类中,关键字的哈希码不应该由hashCode()方法来计算,而应该由System.identityHashCode方法进行计算(即便曾经重新定义了
hashCode方法)。这是Object.hashCode依据对象的内存地址来计算哈希码时运用的方法。另外,为了对各个对象进行比较,IdentityHashMap将运用==,而不运用equals方法。
换句话说,不同的关键字对象,即便它们的内容相反,也被视为不同的对象。IdentityHashMap类可以用于实现对象拓扑构造转换(topology-preserving object graph transformations)
(比照实现对象的串行化或深度拷贝),在进行转换时,需求一个“节点表”跟踪那些曾经处理过的对象的援用。即便碰巧有对象相等,“节点表”也不应视其相等。另一个应用是维护代理
对象。比如,调试工具希望在程序调试时期维护每个对象的一个代理对象。
“IdentityHashMap类不是一般意义的Map实现!它的实现有意的违背了Map接口要求经过equals方法比较对象的约定。这个类仅运用在很少发作的需求强调等同性语义的状况。”
(1) IdentityHashMap (): 构建一个空的全同哈希映像,默认预期最大尺寸为21“预期最大尺寸是映像期望把持的键/值映射的最大数目”
(2) IdentityHashMap (Map m): 构建一个全同哈希映像,并且添加映像m中一切映射
(3) IdentityHashMap (int expectedMaxSize): 构建一个拥有预期最大尺寸的空的全同哈希映像。放置超过预期最大尺寸的键/值映射时,将引起外部数据构造的增长,有时可能很费时。
欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/)
Powered by Discuz! 6.0.0