您的位置:首页 > 编程语言 > Java开发

java集合操作查找表

2017-06-27 21:22 260 查看


2017年6月27日学习总结

Map接口

Map接口定义的集合又称查找表,用于存储"key-value"映射对。key可以看成是value的索引,作为key的对象在集合中

不可以重复。

根据内部数据结构的不同,Map接口有多种实现类,其中常用的有内部为hash表实现的HashMap和内部为排序二叉树实现的TreeMap。

V put(K key, V value)方法:

将key-value对存入Map,如果在集合中已经包含该key,则操作将替换该key所对应的value,返回值为该key原来所对应的value(如果没有则返回null)。

V get(Object key)方法:

返回参数key所对应的value对象,如果不存在则返回null。

boolean containsKey(Object key)方法:

若Map中包含给定的key则返回true,否则返回false。

HashMap

hashCode
的常规协定是

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用
hashCode
方法都必须生成相同的整数结果。

如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 

此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。

HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。

通常,默认加载因子 (.75) 在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销,但同时也增加了查询成本(在大多数 HashMap 类的操作中,包括get 和
put 操作,都反映了这一点)。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少 rehash 操作次数。如果初始容量大于最大条目数除以加载因子,则不会发生 rehash 操作。

如果很多映射关系要存储在 HashMap 实例中,则相对于按需执行自动的 rehash 操作以增大表的容量来说,使用足够大的初始容量创建它将使得映射关系能更有效地存储。

 

Set<K> keySer()方法:

将当前Map中所有的key存入一个Set集合后返回。

Set<Entry<K,V>> entrySet()方法:

将当前Map中每一组key-value对封装为一个Entry对象并存入一个Set集合后返回。

Collection<V> values()方法:

将当前Map中所有的value存入一个Collection集合后返回。

有序的Map

LinkedHashMap实现有序Map

使用Map接口的哈希表和链表实现,具体可预知的迭代顺序。此实现与HashMap的不同之处在于:

LinkedHashMap维护着一个双向循环链表。此链表定义了迭代顺序,该迭代顺序通常就是存放元素的顺序。

案例:

package june;

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

/**

 * 测试查找表的类

 * @author overfront

 *

 */

public class MapTest {

public static void main(String[] args) {
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("小牛", 5000);
map.put("中牛", 10000);
map.put("大牛", 20000);

Integer salary = map.get("大牛");
System.out.println("大牛的薪资是:"+salary);

boolean whether = map.containsKey("攻城狮");
System.out.println("有攻城狮吗:"+whether);

Set<Entry<String,Integer>> setEntry = map.entrySet();
for(Entry<String,Integer> e : setEntry){
String name = e.getKey();
Integer wages =e.getValue();
System.out.println(name+"月工资是"+wages);
}

}

}

控制台输出结果:

大牛的薪资是:20000

有攻城狮吗:false

小牛月工资是5000

中牛月工资是10000

大牛月工资是20000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 地图 map 查找