Java Map使用浅谈

来源:互联网 发布:python http接口 编辑:程序博客网 时间:2024/06/05 04:17

在Java中对于存储多组两个值对,首先想到的是使用容器Map。下面看一下《Java编程思想》中给出的容器类库的简化图:
这里写图片描述

一般常用的是HashMap、LinkedHashMap和TreeMap。HashMap提供了最快的查找技术,它保存元素是无序的。TreeMap是按照key比较结果的升序保存键值的。LinkedHashMap则是按照插入顺序保存的,同时也保存了HashMap的查询速度。

HashMap、LinkedHashMap和TreeMap存储时key值是不能重复的。在添加元素时,都会比较key值是否存在,通过equals方法比较,也就是值是否相等。如果之后再添加相同key值,那么后添加key值对应的value会覆盖之前的value值,但存储顺序不变。

如果想要存储key值相同的键值对时怎么办?一种方法是key、value互换角色存储,也就是value变为key、key变为value存储。但是如果value值也不是唯一的怎么办?另一种方法就是用到类库的简化图中的一个IdentityHashMap类,此类可以存储key值相等的键值对。此处key值相等,但是引用要不等,如果引用相等那么还是会覆盖,在添加元素时会把key值与已有key进行引用比较(==),如果引用相等则覆盖原有key键对应的value值。例如IdentityHashMap对象在添加(“aa”, 1)和 (“aa”, 2)时,”aa”的引用是同一个,会被覆盖。想要存储多个key值相同的字符串,就要使用 (new String(“aa”), 1) 和 (new String(“aa”), 2)。

注意IdentityHashMap不是按照元素添加顺序存储的。如果想要按添加的顺序存储的话,IdentityHashMap显然是不能满足。一种方式是扩展IdentityHashMap类,像LinkedHashMap那样使用链表来实现顺序保存。这种方式相对麻烦点。如果只是想按添加顺序存储数据、key值可以重复,并且可以访问数据的话,那么不用Map存储。可以通过类存储key、value值,然后存储到List中就能到达目的。