4.Java集合总结系列:Map接口及其实现
一、Map接口

Map集合的特点是:通过key值找到对应的value值,key值是唯一的,value可以重复。Map中的元素是无序的,但是也有实现了排序的Map实现类,如:TreeMap。
上面Map接口提供的方法大致可以分为下面几种:
1、put/putAll/remove/clear 增加删除 get/values 获取值
2、containKey/containValue 判断
3、entrySet/keySet 获取迭代
4、equals/hashcode 比较
基本上所有的 Map 接口实现类都使用 put() 方法存入数据、用get() 方法去除数据,使用 entrySet/keySet 迭代获取 Map 数据。
package com.chanshuyi.collection.map; import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class HashMapTest { public static void main(String[] args) {
//增加
Map<String, String> map = new HashMap<String, String>();
map.put("1", "Tom");
map.put("2", "Marry");
map.put("3", "Jacket");
map.put("1", "TomCopy"); //会覆盖掉原来的key为1的Tom System.out.println("Map长度:" + map.size()); //删除
map.remove("1"); //查询
System.out.println("key为3的值:" + map.get("3"));
}
}
所有的 Map 实现类都可以有四种方式实现Map数据的迭代:
package com.chanshuyi.collection.map; import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class HashMapTest { public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "Tom");
map.put("2", "Marry");
map.put("3", "Jacket");
map.put("1", "TomCopy"); //会覆盖掉原来的key为1的Tom //迭代1 keySet()
for(String key : map.keySet()){
System.out.print(map.get(key) + " ");
}
System.out.println(); //迭代2 entrySet()
Set<Entry<String, String>> entrySet = map.entrySet();
for(Entry<String, String> entry : entrySet){
System.out.print(entry.getKey() + ":" + entry.getValue() + " ");
}
System.out.println(); //迭代3 entrySet()
Iterator<Entry<String, String>> it = map.entrySet().iterator();
while(it.hasNext()){
Entry<String, String> entry = it.next();
System.out.print(entry.getKey() + ":" + entry.getValue() + " ");
}
System.out.println(); //迭代4 map.values()
Collection<String> col = map.values();
for(String str : col){
System.out.print(str + " ");
}
}
}
二、HashMap实现类

HashMap 的内部结构是一个数组和链表的结构,存取数据时通过 key 计算哈希值,并将哈希值对Map大小取模确定存取位置。

如果该位置上已经有数据了,那么就通过链表的形式存在该链表上,如果没有则直接存在这个位置上。需要注意的是 HashMap 是非线程同步的,因此在多线程环境下不能使用 HashMap,否则会出现数据错误。
在使用上,HashMap 的使用和 Map 接口没什么区别,也是用 put()/get() 存取数据,用keySet()/entrySet() 迭代 Map,例子可以参考上面 Map 接口的例子,这里不再赘述。
三、Hashtable 实现类

Hashtable实现类同样实现了Map接口,其内部实现以及结构完全与HashMap相同,唯一的区别就是:Hashtable是线程同步的,而HashMap是非线程同步的。因此在多线程环境中推荐用Hashtable,而在非线程环境中用HashMap。
与HashMap一样,Hashtable也是用Map接口提供的 put/get/keySet/entrySet 进行数据操作。例子可以参考上面Map接口的例子,这里不再赘述。
四、WeakHashMap实现类

WeakHashMap 是指弱引用的 HashMap类。弱引用是 Java 引用强度中的一种,弱引用类型告诉 JVM:在你产生内存不足的时候,你可以把 WeakHashMap 类对象的空间释放。也就是说:当除了自身有对 key 有引用外,没有其他变量引用 WeakHashMap 对象,那么此 WeakHashMap 对象会自动丢弃此key对应的value值。
见实例:三个匿名字符串,WeakHashMap 只保留了它们的弱引用,而第4个是字符串直接量,系统会保留该对象的强引用。
package com.chanshuyi.collection.map;
import java.util.WeakHashMap;
public class WeakHashMapTest1 {
public static void main(String[] args) throws Exception {
WeakHashMap<String, String> whm = new WeakHashMap<String, String>();
//添加三个键值对
//三个key键都是匿名字符串对象(没有其它引用)
whm.put(new String("语文"),new String("良好"));
whm.put(new String("数学"),new String("及格"));
whm.put(new String("英文"),new String("中等"));
//添加一个键值对
//该Key是一个系统缓存的字符串对象
whm.put("java",new String("中等"));
//输出whm,将看到四个键值对
System.out.println("Fitst Time:" + whm);
//通知系统进行垃圾回收
System.gc();
System.runFinalization();
//通常情况下将只看到一个键值对
System.out.println("Second Time:" + whm);
}
}
输出结果是:
Fitst Time:{英文=中等, java=中等, 数学=及格, 语文=良好}
Second Time:{java=中等}
五、TreeMap实现类

TreeMap类实现了SortedMap 接口,实现了 Map 集合的排序。TreeMap中实现元素排序与TreeSet的实现方式一样,有两种方式:
1、JavaBean中实现Comparable接口的compareTo()方法
package com.chanshuyi.collection.map;
import java.util.TreeMap;
public class TreeMapTest1 {
public static void main(String[] args) {
TreeMap<String, Student> treeMap = new TreeMap<String, Student>();
treeMap.put("Zpple", new Student("Tpple", 10)); //Map数据是根据key进行排序的
treeMap.put("Tpple", new Student("Tpple", 12));
for(String key : treeMap.keySet()){
System.out.print(treeMap.get(key) + " ");
}
}
}
class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student s) {
if(this.age > s.getAge()){
return 1; //按照自然排序
}else if(this.age == s.getAge()){
return 0;
}else{
return -1;
}
}
public String toString(){
return "[" + this.name + "," + this.age + "]";
}
}
2、构建自定义比较器(实现Comparator接口)
package com.chanshuyi.collection.map; import java.util.Comparator;
import java.util.TreeMap; public class TreeMapTest2 { public static void main(String[] args) {
TreeMap<String, Student> treeMap = new TreeMap<String, Student>(new MyComparator());
treeMap.put("Apple", new Student("Zpple", 10)); //Map数据是根据key进行排序的
treeMap.put("Tpple", new Student("Tpple", 12)); for(String key : treeMap.keySet()){
System.out.print(treeMap.get(key) + " ");
}
}
} class MyComparator implements Comparator<String>{ //用Map的key进行比较
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
}
4.Java集合总结系列:Map接口及其实现的更多相关文章
- Java集合框架之Map接口浅析
Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- Java集合中的Map接口
jdk1.8.0_144 Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap.TreeMap.So ...
- Java集合中的Map接口怎么使用?
Map(双列集合框架) 1.Map接口及实现类概述 Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序 定义为迭代器在映射的 coll ...
- Java中的集合(十三) 实现Map接口的Hashtable
Java中的集合(十三) 实现Map接口的Hashtable 一.Hashtable简介 和HashMap一样,Hashtable采用“拉链法”实现一个哈希表,它存储的内容是键值对(key-value ...
- Java中的集合(十一) 实现Map接口的TreeMap
Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...
- 转:深入Java集合学习系列:HashSet的实现原理
0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...
- 第19章 集合框架(3)-Map接口
第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...
- Java集合框架之Collection接口
Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...
- Java集合框架之四大接口、常用实现类
Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...
随机推荐
- Java之路——敬JAVA初学者(作者:MoMo)
作为一名大四的毕业生,大学三年过,有得有失.作为一个喜欢编程,喜欢JAVA的人,自学其实是一件美事,很有意思的事.要是能再找个女朋友一起学.嘿嘿,就不枉在大学走了一遭啊! 要离开学校了,还是想留 ...
- jquery.validate提示错误方法
修改jquery.validate提示错误方法,将错误信息用弹出框提示 <script src="@Url.Content("~/Scripts/jquery.validat ...
- 记使用sed的一次坑
sed做为linux下的三剑客,自然功能强大,但是如果使用不当,反而适得其反,今天就因为这个命令采了很深坑,分析一下原因,以谏后来者. 情景回顾: 项目中使用的一个python爬虫采用的是多线程并发爬 ...
- WPF 自定义图片按钮
此文档仅仅是一个BaseCode,已做后续查阅 XAML代码: <Button x:Class="IM.UI.UC.IM_ImageButton" xmlns="h ...
- css模拟Bootstrap响应式布局——栅格
做作业的时候遇见用css模拟Bootstrap的栅格布局,学习了一下.发现这个很有用,用来在不同的平台上得到很好地用户体验,比如Phone.Pad.大屏幕显示器.小屏幕显示器.自己模拟用css写了一下 ...
- vuejs数据双向绑定原理(get & set)
前端的数据双向绑定指的是view(视图)和model(数据)两者之间的关系:view层是页面上展示给用户看的信息,model层一般是指通过http请求从后台返回的数据.view到model的绑定都是通 ...
- LeetCode 2. Add Two Numbers 解题报告
题意: 有两个链表,它们表示逆序的两个非负数.例 (2 -> 4 -> 3)表示342,求两个数字的和,并用同样的方式逆序输出.如342+465 = 807,你需要把结果表达为(7 -&g ...
- 版本管理工具 —— SVN
想想我们在开发过程中是不是会遇到这样的情况: 今天写了很长的一段代码,觉得不合理,然后删了,第二天突然发现昨天的那段代码才是正确的,那怎么办,也无法撤销删除的代码? 还有团队中多人共同开发一个项目,如 ...
- CDIF: 基于JSON的SOA软件框架
通用设备互联框架(CDIF)是一个具备中美知识产权保护的,基于web的连接框架,目前有部分开源实现存放在: GitHub - out4b/cdif: Common device interconnec ...
- DOM的内部插入和外部插入
/*****************返回值都是最前面调用这个方法的元素 ***************** */ //这是外部插入 $("div").insertBefore($( ...