您的位置:首页 > 其它

J2SE知识点摘记(二十二)

2013-07-13 19:08 134 查看

Map

1.4.1概述

数学中的映射关系在Java中就是通过Map来实现的。它表示,里面存储的元素是一个对(pair),我们通过一个对象,可以在这个映射关系中找到另外一个和这个对象相关的东西。

前面提到的我们对于根据帐号名得到对应的人员的信息,就属于这种情况的应用。我们讲一个人员的帐户名和这人员的信息作了一个映射关系,也就是说,我们把帐户名和人员信息当成了一个“键值对”,“键”就是帐户名,“值”就是人员信息。下面我们先看看Map接口的常用方法。

1.4.2常用方法

Map
接口不是
Collection
接口的继承。而是从自己的用于维护键-值关联的接口层次结构入手。按定义,该接口描述了从不重复的键到值的映射。

我们可以把这个接口方法分成三组操作:改变、查询和提供可选视图。

改变操作允许您从映射中添加和除去键-值对。键和值都可以为null。但是,您不能把Map作为一个键或值添加给自身。

Objectput(Objectkey,Objectvalue)
:用来存放一个键
-
值对
Map


Objectremove(Objectkey)
:根据
key(
)
,移除一个键
-
值对,并将值返回


voidputAll(Mapmapping)
:将另外一个
Map
中的元素存入当前的
Map


voidclear()
:清空当前
Map
中的元素


查询操作允许您检查映射内容:

Objectget(Objectkey)
:根据
key(
)
取得对应的值


booleancontainsKey(Objectkey)
:判断
Map
中是否存在某键(
key


booleancontainsValue(Objectvalue):
判断
Map
中是否存在某值
(value)


intsize():
返回
Map
键-值对的个数

booleanisEmpty()
:判断当前
Map
是否为空


最后一组方法允许您把键或值的组作为集合来处理。

publicSetkeySet()
:返回所有的键(
key
),并使用
Set
容器存放


publicCollectionvalues()
:返回所有的值(
Value
),并使用
Collection
存放


publicSetentrySet()
返回一个实现Map.Entry接口的元素Set

因为映射中键的集合必须是唯一的,就使用Set来支持。因为映射中值的集合可能不唯一,就使用Collection来支持。最后一个方法返回一个实现Map.Entry接口的元素Set。

我们看看Map的常用实现类的比较,如下表:

简述

实现

操作特性

成员要求

Map

保存键值对成员,基于键找值操作,使用compareTocompare方法对键进行排序

HashMap

能满足用户对Map的通用需求

键成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

TreeMap

支持对键有序地遍历,使用时建议先用HashMap增加和删除成员,最后从HashMap生成TreeMap附加实现了SortedMap接口,支持子Map等要求顺序的操作

键成员要求实现Comparable接口,或者使用Comparator构造TreeMap键成员一般为同一类型。

LinkedHashMap

保留键的插入顺序,用equals方法检查键和值的相等性

成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

下面我们看一个简单的例子:

importjava.util.*;

publicclassMapSortExample{

publicstaticvoidmain(Stringargs[]){

Mapmap1=newHashMap();

Mapmap2=newLinkedHashMap();

for(inti=0;i<10;i++){

doubles=Math.random()*100;//产生一个随机数,并将其放入Map中

map1.put(newInteger((int)s),"第"+i+"个放入的元素:"+s+"\n");

map2.put(newInteger((int)s),"第"+i+"个放入的元素:"+s+"\n");

}

System.out.println("未排序前HashMap:"+map1);

System.out.println("未排序前LinkedHashMap:"+map2);

//使用TreeMap来对另外的Map进行重构和排序

MapsortedMap=newTreeMap(map1);

System.out.println("排序后:"+sortedMap);

System.out.println("排序后:"+newTreeMap(map2));

}

}


ViewCode

该程序的一次运行结果为:

未排序前HashMap:{64=第1个放入的元素:64.05341725531845

,15=第9个放入的元素:15.249165766266382

,2=第4个放入的元素:2.66794706854534

,77=第0个放入的元素:77.28814965781416

,97=第5个放入的元素:97.32893518378948

,99=第2个放入的元素:99.99412014935982

,60=第8个放入的元素:60.91451419025399

,6=第3个放入的元素:6.286974058646977

,1=第7个放入的元素:1.8261658496439903

,48=第6个放入的元素:48.736039522423106

}

未排序前LinkedHashMap:{77=第0个放入的元素:77.28814965781416

,64=第1个放入的元素:64.05341725531845

,99=第2个放入的元素:99.99412014935982

,6=第3个放入的元素:6.286974058646977

,2=第4个放入的元素:2.66794706854534

,97=第5个放入的元素:97.32893518378948

,48=第6个放入的元素:48.736039522423106

,1=第7个放入的元素:1.8261658496439903

,60=第8个放入的元素:60.91451419025399

,15=第9个放入的元素:15.249165766266382

}

排序后:{1=第7个放入的元素:1.8261658496439903

,2=第4个放入的元素:2.66794706854534

,6=第3个放入的元素:6.286974058646977

,15=第9个放入的元素:15.249165766266382

,48=第6个放入的元素:48.736039522423106

,60=第8个放入的元素:60.91451419025399

,64=第1个放入的元素:64.05341725531845

,77=第0个放入的元素:77.28814965781416

,97=第5个放入的元素:97.32893518378948

,99=第2个放入的元素:99.99412014935982

}

排序后:{1=第7个放入的元素:1.8261658496439903

,2=第4个放入的元素:2.66794706854534

,6=第3个放入的元素:6.286974058646977

,15=第9个放入的元素:15.249165766266382

,48=第6个放入的元素:48.736039522423106

,60=第8个放入的元素:60.91451419025399

,64=第1个放入的元素:64.05341725531845

,77=第0个放入的元素:77.28814965781416

,97=第5个放入的元素:97.32893518378948

,99=第2个放入的元素:99.99412014935982

}

从运行结果,我们可以看出,HashMap的存入顺序和输出顺序无关。而LinkedHashMap则保留了键值对的存入顺序。TreeMap则是对Map中的元素进行排序。在实际的使用中我们也经常这样做:使用HashMap或者LinkedHashMap来存放元素,当所有的元素都存放完成后,如果使用则是需要一个经过排序的Map的话,我们再使用TreeMap来重构原来的Map对象。这样做的好处是:因为HashMap和LinkedHashMap存储数据的速度比直接使用TreeMap要快,存取效率要高。当完成了所有的元素的存放后,我们再对整个的Map中的元素进行排序。这样可以提高整个程序的运行的效率,缩短执行时间。

这里需要注意的是,TreeMap中是根据键(Key)进行排序的。而如果我们要使用TreeMap来进行正常的排序的话,Key中存放的对象必须实现Comparable接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: