一、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. Android Weekly Notes Issue #245

    Android Weekly Issue #245 February 19th, 2017 Android Weekly Issue #245 本期内容: 写好单元测试的几条原则; 如何mock Ko ...

  2. 浅谈iOS程序员的成长和进阶

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  3. ARP攻击

    ARP攻击,是针对以太网地址解析协议(ARP)的一种攻击技术,就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞.此种攻击可让攻击者取得局域网上的数据封包甚至 ...

  4. 关于volatile的可见性和禁止指令重排序的疑惑

    在学习volatile语义的可见性和禁止指令重排序的相关测试中,发现并不能体现出禁止指令重排序的特性 实验代码如下 package com.aaron.beginner.multithread.vol ...

  5. 【JSON学习之道】js操作JSON

    JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...

  6. RunTime.getRuntime().exec()运行脚本命令介绍和阻塞

     java在企业级项目开发中,无论是强制性的功能需要,还是为了简便java的实现,需要调用服务器命令脚本来执行.在java中,RunTime.getRuntime().exec()就实现了这个功能.  ...

  7. TCP和UDP 的区别和适用场合

    TCP和UDP式TCP/IP中能够实现传输层功能的.具有代表性的协议,其主要特点和区别如下: TCP: 面向连接的.可靠的流协议.为提供可靠性传输,TCP实行"顺序控制"或&quo ...

  8. 不需要密码的windows计划任务设置

    使用windows计划任务定时做些事情,确实非常方便,但创建任务时老是需要设置密码,否则在执行任务时会报80070005的系统错误导致任务无法执行. 有时windows没设密码或当账户修改密码就必须修 ...

  9. Spring Boot 相关文章目录

    目录 监控 SpringBoot之旅 -- SpringBoot 项目健康检查与监控

  10. 2243: [SDOI2011]染色

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 3113  Solved: 1204[Submit][Status ...