一、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接口及其实现的更多相关文章

  1. Java集合框架之Map接口浅析

    Java集合框架之Map接口浅析 一.Map接口综述: 1.1java.util.Map<k, v>简介 位于java.util包下的Map接口,是Java集合框架的重要成员,它是和Col ...

  2. Java集合框架中Map接口的使用

    在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...

  3. Java集合中的Map接口

    jdk1.8.0_144 Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap.TreeMap.So ...

  4. Java集合中的Map接口怎么使用?

    Map(双列集合框架) 1.Map接口及实现类概述 Map 接口提供三种collection 视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序 定义为迭代器在映射的 coll ...

  5. Java中的集合(十三) 实现Map接口的Hashtable

    Java中的集合(十三) 实现Map接口的Hashtable 一.Hashtable简介 和HashMap一样,Hashtable采用“拉链法”实现一个哈希表,它存储的内容是键值对(key-value ...

  6. Java中的集合(十一) 实现Map接口的TreeMap

    Java中的集合(十一) 实现Map接口的TreeMap 一.TreeMap简介(基于JDK1.8) TreeMap是基于红黑树数据结构,是一个key-value的有序集合,该映射根据其键的自然顺序进 ...

  7. 转:深入Java集合学习系列:HashSet的实现原理

    0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...

  8. 第19章 集合框架(3)-Map接口

    第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...

  9. Java集合框架之Collection接口

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  10. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

随机推荐

  1. 使用git恢复未提交的误删数据

    不小心将项目中一个文件夹删除还未提交,或者已经提交, 此时想要恢复数据该怎么办? 答案是git reflog,使用git reflog命令可以帮助恢复git误操作,进行数据恢复. 操作过程: 打开终端 ...

  2. 前端安全(XSS、CSRF防御)

    一.网络安全          OWASP:开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)        OWASP是一个开源的 ...

  3. .net 爬虫技术

    关于爬虫 从搜索引擎开始,爬虫应该就出现了,爬的对象当然也就是网页URL,在很长一段时间内,爬虫所做的事情就是分析URL.下载WebServer返回的HTML.分析HTML内容.构建HTTP请求的模拟 ...

  4. sql decimal & float & celling 介绍

    decimal 可以用在指定几个位数比如 123.456, decimal(3,3), 用这类型计算比较准确. 默认情况下,将数字转换为较低精度和小数位数的 decimal 或 numeric 值时, ...

  5. PHP字符串三种定义方式

    PHP的字符串有三种定义方式:单引号 .双引号 .定界符  1.单引号:指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来. 在被单引号括起来的字符串中,要再表示一个单引号,需要用反斜线(\ ...

  6. mvc关于三级联动修改时数据回显

    在网上找了好久,都没有找到自己想要的那种效果,最后还是自己写出来了, 虽然方法有点笨. 这是Controller里 public ActionResult Edit(string id) { //查询 ...

  7. Git基础教程(一)

    本教程为学习笔记,github作为最受欢迎的资源库,不可不学!详细教程参见:廖雪峰的官方网站Git教程系列.准备花两篇幅搞定实战总结,闲言碎语少说,脚踏实地求真! 1,Git入门       Git是 ...

  8. GCD浅析

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Helvetica; color: #000000 } span.s1 { } 1.关于GCD ...

  9. Troubleshooting OpenStack Bug- 每天5分钟玩转 OpenStack(162)

    这是 OpenStack 实施经验分享系列的第 12 篇. 问题描述 客户报告了一个问题:对 instance 执行 migrate 操作,几个小时了一直无法完成,不太正常. 问题分析 遇到这种情况, ...

  10. 1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区(题解第一弹)

    1675: [Usaco2005 Feb]Rigging the Bovine Election 竞选划区 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit:  ...