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:存储无序的 ...
随机推荐
- Python sphinx-build在Windows系统中生成Html文档
看到前同事发布的“Markdown/reST 文档发布流水线”基于TFS.Docker.Azure等工具和平台进行文档发布的介绍说明,不得不在心中暗暗竖起大拇指.这套模式,实现了文档编写后版本管理.发 ...
- iOS arc下控制某一文件为非arc
选中文件加上编译参数 -fno-objc-arc即可.
- storm 1.0版本滑动窗口的实现及原理
滑动窗口在监控和统计应用的场景比较广泛,比如每隔一段时间(10s)统计最近30s的请求量或者异常次数,根据请求或者异常次数采取相应措施.在storm1.0版本之前,没有提供关于滑动窗口的实现,需要开发 ...
- angularjs+ionic注册页面表单验证(手机号、确认密码、60s后重发验证码)
在已建立tabs和路由的注册页面html: 功能: 进行了手机号.密码格式验证,两次密码输入是否相同的判断,都正确且复选框勾选后才可点击注册,进入tabs.mypage页面. 未进行验证码真正发送.获 ...
- Python 3 读写文件的简单方法!
Python 3 读写文件的简单方法! a = open('test.txt','w') 这行代码创建了一个名为test的文本文档,模式是写入(模式分为三种,w代表写入,r代表阅读,a代表在尾行添加) ...
- Django之admin
django amdin是django提供的一个后台管理页面,改管理页面提供完善的html和css,使得你在通过Model创建完数据库表之后, 就可以对数据进行增删改查,而使用django admin ...
- SVNManager配置
1.svn与apache的安装 yum install -y subversion httpd httpd.conf添加如下内容: LoadModule dav_svn_module module ...
- 3403: [Usaco2009 Open]Cow Line 直线上的牛
3403: [Usaco2009 Open]Cow Line 直线上的牛 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 71 Solved: 62[S ...
- QT 的使用及编写代码遇到的问题和解决方法
QT 中将 QString 转化为 const char * 的问题 我开始的代码是这样的: QString qstr = "abcdef"; const char * cc = ...
- 自己做得一个用于直观观察css3 transform属性中的rotate 3D效果
这段代码还是非常简单,是看了一个老师的视频受的启发,也是调用了很多个函数,所以比较杂乱吧! <!DOCTYPE html><html lang="en">& ...