Map以及HashMap
本文主要介绍java集合框架的Map集合,在日常生活中Map的运用也十分广泛。
与List集合、Set集合隶属于Collection不同,Map是一个独立的接口,与Collection相同级别的接口。
重要的是,Map集合提供了一个不一样的元素存储方法,利用“key—value”的形式进行存储。其中,每个键映射一个值。而在Set集合中,元素的存储就是利用Map的这一特性来实现。
简单的介绍了下Map集合,接下来,就让笔者对其主要实现类HashMap、TreeMap、HashTable进行详细的说明。
1 Map常用方法
具体介绍之前,我们先了解下Map接口本身,一边了解所有实现的共同点。
public interface Map<K,V> { //返回Map中的key--value的数目
int size(); //如果Map不包含任何key--value,则返回 true
boolean isEmpty(); //如果Map中包含指定key的映射,则返回true
boolean containsKey(Object key); //如果此Map将一个或多个键映射到指定值,则返回 true
boolean containsValue(Object value); //返回与指定键关联的值
V get(Object key); //将指定值与指定键相关联
V put(K key, V value); //从Map中删除键和关联的值
V remove(Object key); //将指定Map中的所有映射复制到此map
void putAll(java.util.Map<? extends K, ? extends V> m); //从Map中删除所有映射
void clear(); //返回Map中所包含键的Set集合
Set<K> keySet(); //返回 map 中所包含值的 Collection集合。
Collection<V> values(); //返回Map中所包含映射的Set视图。Set中的每个元素都是一个 Map.Entry 对象
Set<java.util.Map.Entry<K, V>> entrySet(); //比较指定对象与此 Map 的等价性
boolean equals(Object o); //返回此 Map 的哈希码
int hashCode(); //Map集合中存储key--value的对象Entry,在Map集合内形成数组结构
interface Entry<K,V> { V getValue(); V setValue(V value); boolean equals(Object o); int hashCode();
}
}
2 HashMap
HashMap基于哈希表,底层结构由数组来实现,添加到集合中的元素以“key—value”形式保存到数组中,在数组中key—value被包装成一个实体来处理—-也就是上面Map接口中的Entry。
在HashMap中,Entry[]保存了集合中所有的键值对,当我们需要快速存储、获取、删除集合中的元素时,HashMap会根据hash算法来获得“键值对”在数组中存在的位置,以来实现对应的操作方法。
此时,细心的朋友可能会问,既然是基于哈希表的实现,那么当新增的元素出现了hash值重复了怎么办,怎么插入呢?
专业上来说,hash值重复的情况,我们称之为哈希碰撞(又或者哈希冲突)。在HashMap中,是通过链表的形式来解决的,在hash值重复的数组角标下,通过链表将新插入的元素依次排列,当然如果插入的key相同,那么我们会将新插入的value覆盖掉原有的value;
像上图所示,当产生了hash冲突后,会在产生冲突的角标下,生成链表,依次排列。
HashMap继承于AbstractMap,实现了Map, Cloneable, Serializable接口。
(1)HashMap继承AbstractMap,得到了Map接口中定义方法的实现,减少实现Map接口所需的工作;
(2)HashMap实现Map,得到了Map接口定义的所有方法,其中一部分AbstractMap已实现;
(3)HashMap实现Cloneable,得到了clone()方法,可以实现克隆功能;
(4)HashMap实现Serializable,表示可以被序列化,通过序列化去传输,典型的应用就是hessian协议。
它具有如下特点:
允许存入null键,null值(null值只有一个,并存于数组第一个位置)
无序集合,而且顺序会随着元素的添加而随时改变(添加顺序,迭代顺序不一致)
随着元素的增加而动态扩容(与ArrayList原理一致)
不存在重复元素(得益于hashCode算法和equals方法)
线程不安全
3 HashMap基本操作
public static void main(String[] agrs){
//创建HashMap集合:
Map<String,String> map = new HashMap<String,String>();
System.out.println("HashMap元素大小:"+map.size()); //元素添加:
map.put("hi","hello");
map.put("my","hello");
map.put("name","hello");
map.put("is","hello");
map.put("jiaboyan","hello"); //遍历1:获取key的Set集合
for(String key:map.keySet()){
System.out.println("map的key是:"+key);
System.out.println("map的value是:"+map.get(key));
} //遍历2:得到Set集合迭代器
Set<Map.Entry<String,String>> mapSet1 = map.entrySet();
Iterator<Map.Entry<String,String>> iterator = mapSet1.iterator();
while(iterator.hasNext()){
Map.Entry<String,String> mapEntry = iterator.next();
System.out.println("map的key是:" + mapEntry.getKey());
System.out.println("map的value是:" + mapEntry.getValue());
} //遍历3:转换成Set集合,增强for循环
Set<Map.Entry<String,String>> mapSet2 = map.entrySet();
for(Map.Entry<String,String> mapEntry : mapSet2){
System.out.println("map的key是:" + mapEntry.getKey());
System.out.println("map的value是:" + mapEntry.getValue());
} //元素获取:通过key获取value
String keyValue = map.get("jiaboyan");
System.out.println("HashMap的key对应的value:" + keyValue); //元素替换:map没有提供直接set方法,而是使用新增来完成更新操作
map.put("jiaboyan","helloworld");
System.out.println("HashMap的key对应的value:" + map.get("jiaboyan")); //元素删除:
String value = map.remove("jiaboyan");
System.out.println("HashMap集合中被删除元素的value" + value);
//清空所有元素:
map.clear(); //hashMap是否包含某个key:
boolean isContain = map.containsKey("hello");
//hashMap是否为空:
boolean isEmpty = map.isEmpty();
}
Map以及HashMap的更多相关文章
- Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)
概要 学完了Map的全部内容,我们再回头开开Map的框架图. 本章内容包括:第1部分 Map概括第2部分 HashMap和Hashtable异同第3部分 HashMap和WeakHashMap异同 转 ...
- JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API
一.Map简述 1.1.简述 public interface Map<K,V> 类型参数: K - 此映射所维护的键的类型 key V - 映射值的类型 value 该集合提供键--值的 ...
- 【转】java 容器类使用 Collection,Map,HashMap,hashTable,TreeMap,List,Vector,ArrayList的区别
原文网址:http://www.360doc.com/content/15/0427/22/1709014_466468021.shtml java 容器类使用 Collection,Map,Hash ...
- Map map=new HashMap(); 为什么是这样
Map是接口,hashMap是Map的一种实现.接口不能被实例化. Map map=new HashMap(); 就是将map实例化成一个hashMap.这样做的好处是调用者不需要知道map具体的实现 ...
- (10)集合之双列集合Map,HashMap,TreeMap
Map中的元素是两个对象,一个对象作为键,一个对象作为值.键不可以重复,但是值可以重复. 看顶层共性方法找子类特有对象. Map与Collection在集合框架中属并列存在 Map存储的是键值对 Ma ...
- java容器类2:Map及HashMap深入解读
Java的编程过程中经常会和Map打交道,现在我们来一起了解一下Map的底层实现,其中的思想结构对我们平时接口设计和编程也有一定借鉴作用.(以下接口分析都是以jdk1.8源码为参考依据) 1. Map ...
- Map,HashMap,TreeMap
一.HashMap,TreeMap差别 1.两种常规Map性能 HashMap:适用于在Map中插入.删除和定位元素. Treemap:适用于按自然顺序或自定义顺序遍历键(key). 2.总结 Has ...
- Map,HashMap,LinkedHashMap,TreeMap比较和理解
/* * 获取功能: * V get(Object key):根据键获取值 * Set<K> keySet():获取集合中所有键的集合 * Collection<V> valu ...
- java中map接口hashMap以及Enty之间的用法和关系
java中map接口hashMap以及Enty之间的转换 首先说的是map接口: Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value ...
- Map map=new HashMap()
Map是接口,hashMap是Map的一种实现.接口不能被实例化.Map map=new HashMap(); 就是将map实例化成一个hashMap.这样做的好处是调用者不需要知道map具体的实现, ...
随机推荐
- FZU - 2218 Simple String Problem 状压dp
FZU - 2218Simple String Problem 题目大意:给一个长度为n含有k个不同字母的串,从中挑选出两个连续的子串,要求两个子串中含有不同的字符,问这样的两个子串长度乘积最大是多少 ...
- TensorFlow使用记录 (九): 模型保存与恢复
模型文件 tensorflow 训练保存的模型注意包含两个部分:网络结构和参数值. .meta .meta 文件以 “protocol buffer”格式保存了整个模型的结构图,模型上定义的操作等信息 ...
- DOM访问关系(父节点 子节点)
把下面的知识点掌握了,可以做一下下面的案例,都是工作中常用的,很有用 知识点 1.带Eleent和不带区别 a)带Element的获取的是元素节点 b)不带Element的获取文本 ...
- Java线程中的异常处理
对于对线程,当主线程中有子线程运行出现异常时,主线程是不能捕获到该异常的,子线程会直接退出,不会记录任何日志. 解决: 1.子线程中try catch. 2.设置线程的未捕获异常处理器,Uncaugh ...
- 开源!js实现微信/QQ直接跳转到支付宝APP打开口令领红包!附:demo
最近支付宝的领红包可真是刷爆了各个微信群啊,满群都是支付宝口令. 可是这样推广可不是办法,又要复制又要打开支付宝又要点领取,太麻烦了. 于是乎,提出了一个疑问!是否可以在微信里面点一个链接然后直接打开 ...
- leetcode题目15.三数之和(中等)
题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重 ...
- LeetCode 134. 加油站(Gas Station)
题目描述 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升. 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升.你从其 ...
- Log4j rootLogger根配置以及4种日志级别
Log4j 根配置语法 log4j.rootLogger = [ level ] , appenderName, appenderName, … 把指定级别以上的日志信息输出到指定的一个或者多个位置 ...
- Collapse 折叠面板
通过折叠面板收纳内容区域 基础用法 可同时展开多个面板,面板之间不影响 <el-collapse v-model="activeNames" @change="ha ...
- super()使用方法
super()使用方法 我们经常在类的继承当中使用super(), 来调用父类中的方法.例如下面: class A: def func(self): print('OldBoy') class B ...