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

RE:JAVA学习-HashMap用法

2017-08-23 21:08 393 查看
1.Map 查询表

1.1 用于存储”Key-Value” 映射对。Key可以看作Value的索引(其关系类似高中学过的函数x-y的映射)

1.2 常见实现类:HashMap TreeMap

1.3 Map中常用方法:

V put(K key,V value) 向Map中存放元素(如果集合中已存在相同的Key,则替换该Key所对应的Value,返回原Value值,没有则返回null)

V get(Object key) 获取元素

boolean containsKey(Object key) 判断该key是否存在

public class Map_put_get_remove {
public static void main(String[] args) {
Map<String,Integer> map=new HashMap<String,Integer>();
/*
* V put(K k,V v)
* 将给定的key-value对存入Map
* 由于Map要求key不允许重复,所以若使用
* Map已有的key存入value时就是替换value
* 操作,返回值为被替换的value.若给定的
* key不存在,则返回值为null
*/
map.put("语文",99);
map.put("数学",88);
map.put("英语",77);
map.put("物理",55);
map.put("化学",66);
System.out.println(map);//{物理=55, 语文=99, 英语=77, 数学=88, 化学=66}
//替换"语文"原来对应的value
Integer d=map.put("语文",30);
System.out.println(map);//{物理=55, 语文=30, 英语=77, 数学=88, 化学=66}
System.out.println("old:"+d);//old:99

/*
*V get(K k)
*获取给定的key所对应的value
*若给定的key不存在,则返回null
*/
d=map.get("数学");
System.out.println("数学:"+d);//数学:88

/*
* V remove(K k)
* 根据给定的key将对应的这组键值对删除
* 返回值为对应的value
* 若给定的key不存在则返回值为null
*/
d=map.remove("语文");
System.out.println(map);//{物理=55, 英语=77, 数学=88, 化学=66}
System.out.println("remove_value:"+d);//remove_value:30
}
}


2.HashMap

2.1 Hash表原理:当我们向HashMap中存入一组键值对时,HashMap首先获取key这个对象的hashcode()方法的返回值,然后使用该值进行一个散列算法,得出一个数字,这个数字就是这组键值对要存入散列数组中的下标位置。

那么得知了下标位置后,HashMap还会查看散列数组当前位置是否包含该元素。(这里要注意的是,散列数组中每个元素并非是直接存储键值对的,而是存入了一个链表,这个链表中的每个节点才是真实保存这组键值对的。)检查是否包含该元素时根据当前要存入的key在当前散列数组对应位置中的链表里是否已经包含这个key,若不包含则将这组键值对存入链表,否则就替换value。

2.2重写equals方法与hashcode方法原则:

(原因:影响散列表(HashMap)查询性能的一个主要因素就是作为Key元素equals方法与hashcode方法的结果,妥善重写这两个方法可以避免在HashMap中出现链表导致HashMap检索性能降低)

成对重写:当我们需要重写一个类的equals方法时就应当连同重写hashcode

一致性:当两个对象equals比较为true时,hashcode方法返回的数字应当相等,反之亦然.

稳定性:当参与equals比较的属性没有发生变化的前提下,多次调用hashcode方法返回的数字必须相同

2.3 装载因子及HashMap优化

Capacity:容量,

Initial capacity:初始容量(默认构建容量是16)

Size : 大小

Load factor:加载因子, 默认值0.75(散列表增加数据时如果 size/capacity 的值大于Load factor则发生扩容并且重新散列(rehash))

3.Map的遍历方法

3.1 Set<K> keySet() 遍历所有的Key
将当前Map中所有的Key存入一个Set集合后返回
3.2 Set<Entry<K,V>> entrySet() 遍历所有的键值对
将当前Map中每一组key-value对封装为一个Entry对象并存入一个Set集合后返回
3.3 遍历所有的Value(不常用)
Collection<V> values()
将当前Map中所有的value存入一个集合后返回


public class Map_iterate {
public static void main(String[] args) {
Map<String,Integer> map=new HashMap<String,Integer>();
map.put("语文", 99);
map.put("数学", 44);
map.put("英语", 77);
map.put("物理", 33);
map.put("化学", 55);

/*
* 遍历所有的key
* Set<k> keySet()
* 将当前Map中所有的key以一个Set集合形式返回
* 所以遍历这个Set集合就等同于遍历了所有的key
*/
Set<String> keySet=map.keySet();
for(String key:keySet){
System.out.println("key:"+key);
}

/*
* 获取每一组键值对
* 在Map内部,每一组键值对是用Map内部类Entry
* 的实例表示的(Entry是接口,不同的Map实现类
* 都实现了Entry用于表示一组键值对)
* Set<Entry> entrySet<>
* 将当前Map中所有的键值对(若干Entry实例)存入
* 一个Set集合并返回
*/
Set<Entry<String,Integer>> entrySet=map.entrySet();
for(Entry<String,Integer> e:entrySet){
String key=e.getKey();
Integer value=e.getValue();
System.out.println(key+":"+value);
}

/*
* 遍历所有value
* Collection<V> values()
* 将当前Map中所有的value存入一个集合后返回
*/
Collection<Integer> values=map.values();
for(Integer value:values){
System.out.println("value:"+value);
}
}
}


4.LinkedHashMap

Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: