Map接口实现Collection接口,是集合三大接口之一。

  Map接口在声明:public interface Map<K,V>;将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值,如果一个键映射到多个值,其前面映射的值将会被后面映射的值所覆盖,其映射关系的实现类主要是HasgMap和TreeMap类,HashMap的映射实现不保存顺序,TreeMap的映射实现,可明确保证其顺序。

1.HashMap

HashMap声明:

 public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

  HashMap类是基于哈希表(数组和链表)Map接口的实现,允许使用null键和mull值,非同步,线程不安全,其大致与Hashtable相同,此类不保证映射的顺序,及顺序不能恒久不变。其默认构造方法构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap,也就是当数组容量达到总容量的75%,数组要进行扩充,则要对该哈希表进行 rehash 操作,即重建内部数据结构(哈希表的重新散列)。哈希表保存对象时,根据键(K)对象的hashcode对HashMap此时总容量求余,以确定该键值对代表的映射关系存在数组的哪一个位置,之后在该位置的其他映射关系将以链表的形式存放。

 package com.test;

 import java.util.HashMap;
import java.util.Map;
import java.util.Set; public class HashMapDemo {
public static void hashMap(){
Map<Integer, String> hashmap = new HashMap<>();
hashmap.put(1, "string1");
hashmap.put(2, "string2");
hashmap.put(3, "string3");
hashmap.put(3, "string4");//注意相同键值下的映射关系的覆盖
hashmap.put(null, "string3");
hashmap.put(null, "string4");
/*
* null为作为键时,继续保持键的唯一性(键中只能出现一次),若键有多个映射值,则最后一个映射值覆盖前面的映射值
* null作为值时与键有唯一性,可多次使用
*/
System.out.println("null为键时得到的值:"+hashmap.get(null));
hashmap.put(4, null);//关联键值对
hashmap.put(5, null);
System.out.println("null作为值时返回:"+hashmap.get(5));
/*
* HashMap的遍历
* keySet()返回此映射所包含的所有键的Set视图
*/
System.out.println("******HashMap的遍历******");
Set<Integer> h = hashmap.keySet();
for (Integer i : h) {
System.out.println(hashmap.get(i));
}
}
public static void main(String[] args) {
hashMap();
}
}

运行结果:

 null为键时得到的值:string4
null作为值时返回:null
******HashMap的遍历******
string4
string1
string2
string4
null
null

2.Hashtable

Hashtable声明:

 public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable
  此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null 对象都可以用作键或值,同步,线程安全,键具有唯一性,同一键值的映射关系后面的赋值会覆盖前面相同键对应的值,其他与HashMap类似。
 package com.test;

 import java.util.Hashtable;
import java.util.Set;
/*
* Hashtable类似于HashMap
* 线程安全,键值对任何一方不能使用null值
*/
public class HashtableDemo {
public static void main(String[] args) {
Hashtable<String,String> hashtable = new Hashtable<>();
hashtable.put("1", "manu1");
hashtable.put("2", "manu2");
hashtable.put("3", "manu3");
// hashtable.put(null, "manu3");//报错
// hashtable.put("4", null);
hashtable.put("3", "manu5");
Set<String> set = hashtable.keySet();
for (String s : set) {
System.out.println(hashtable.get(s));
}
}
}
运行结果:
manu5
manu2
manu1

3.TreeMap

TreeMap类的声明:

 public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable

  TreeMap是基于红黑树实现,是一种平衡二叉树,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法,非同步,线程不安全,相较HashMap速率稍慢。

 package com.test;

 import java.util.Iterator;
import java.util.Map.Entry;
import java.util.TreeMap; /*
* 基于红黑树实现,又叫平衡二叉树
* 自定义对象作为键时 ,必须实现comparator接口
* 以自然顺序或按照compareto方法规定排序
* 键的唯一性
*/
public class TreeMapDemo {
public static void main(String[] args) {
TreeMap<String,Test> treemap = new TreeMap<>();
Test t1 = new Test(1,"manu1",10);
Test t2 = new Test(2,"manu2",20);
Test t3 = new Test(3,"manu3",30);
treemap.put("a", t1);
treemap.put("a", t2);//Map中键值对的键都具有唯一性,会覆盖前面的
treemap.put("b", t3);
System.out.println(treemap.get("a"));
System.out.println(treemap.get("b"));
/*
* entrySet()
* 返回此映射中包含的映射关系的 Set视图,就是获取键值对对象集合
* 而keySet()返回此映射中包含的键的Set视图 ,就是获取该集合中的K集合
*/
System.out.println("******Iterator******");
Iterator<Entry<String, Test>> i = treemap.entrySet().iterator();
while(i.hasNext()){
System.out.println(i.next());
}
} }
运行结果:
id=2, name=manu2, age=20
id=3, name=manu3, age=30
******Iterator******
a=id=2, name=manu2, age=20
b=id=3, name=manu3, age=30

 

关于Map集合的更多相关文章

  1. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  2. Java常用的几种集合, Map集合,Set集合,List集合

    Java中  Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...

  3. Map集合

    1:Map (1)将键映射到值的对象. 一个映射不能包含重复的键:每个键最多只能映射到一个值. 键值对的方式存在 (2)Map和Collection的区别? A:Map 存储的是键值对形式的元素,键唯 ...

  4. MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)

    一.字段名与属性名(数据库的名字)不一样怎么办? 方案一:在小配置中配置一个resultMapper <!--方案一:resultMapper 字段名与属性名不一致 --> <res ...

  5. Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、

    特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣)                       ...

  6. java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)

    import java.util.*; public class Person implements Comparable<Person>//使Person的属性具有比较性 { priva ...

  7. Java集合类学习笔记(Map集合)

    Map用于保存具有映射关系的数据,因此Map集合里保存着两组数据,一组用于保存Map的key,一组用于保存key所对应的value. Map的key不允许重复. HashMap和Hashtable都是 ...

  8. java学习第18天(map集合)

    Map集合是将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 存储的是键值对形式的元素,键唯一,值可以重复,有点类似于数据库中的主键加数据.主要功能有: A:添加功能 put ...

  9. Map集合 总结

    (本人第一次写博客,部分内容有参照李刚老师的疯狂java系列图书,如有遗漏错误,请多指教,谢谢.) Java的集合类可分为Set.List.Map.Queue,其中Set.List.Queue都有共同 ...

  10. Map集合的应用及其遍历方式

    ---> HashMap :底层基于哈希表      存储原理也使用哈希表来存放的:            往HashMap添加了元素 ,首先会调用键的hashCode方法 获得一个哈希值,然后 ...

随机推荐

  1. Mac系统下React Native环境搭建

    这里记录一下在Mac系统下搭建React Native开发环境的过程: 1. 安装HomeBrew: /usr/bin/ruby -e "$(curl -fsSL https://raw.g ...

  2. Mac 下locate命令使用问题WARNING: The locate database (/var/db/locate.database) does not exist.

    想在Mac下使用locate时,提醒数据库没创建: WARNING: The locate database (/var/db/locate.database) does not exist. To ...

  3. 浅谈我对C#中抽象类与接口的理解

    C#中的抽象类与接口有些相似,初学者很容易混淆,今天就让我来谈谈对二者的理解. 首先我们得明确二者的含义,分述如下: 如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个 ...

  4. Dump类型说明

    通过使用windbg提供DbgHelp库中的MiniDumpWriteDump函数在程序崩溃时写dump文件记录程序当时状态,为后续分析问题提供现场. 该函数提供了DumpType参数,让程序员根据具 ...

  5. java中的小数的取整的几种函数

    Math类中提供了5个与取整相关的函数,如下所示: static double ceil(double a):天花板函数,返回大于等于a的最小整数(但是以浮点数形式存储). static double ...

  6. 常用的sublime text插件(很爽哦)

    个人比较懒,平时喜欢用webstorm,但是因为webstorm打开实在太慢了,并且太看设备,所以本人编辑简单的文件依然会选择使用sublime,虽然网上有很多关于此类插件的分享了,但是感觉都是片段, ...

  7. python 小程序大文件的拆分合并

    1. 将大文件拆分为小文件 I 通过二进制的方式将大文件读取出来,将其拆分存,以不同的文件方式存放在一个目录下面 II 提供两种操作方式交互式和命令行模式 #! usr/bin/python # -* ...

  8. Java基础加强之集合篇(模块记忆、精要分析)

    千里之行,始于足下.把别人的变成自己,再把自己的分享给别人,这也是一次提升的过程.本文的目的是以一篇文章从整体把握集合体系又不失一些细节上的实现,高手路过. 集合的作用与特点 Java是一门面向对象语 ...

  9. oracle中批量生成字段类型的脚本

    select ' ALTER TABLE '||table_name || '  MODIFY( '|| column_name || ' DATE );' from USER_TAB_COLUMNS ...

  10. 【Python装饰者】在函数测试的作用

    [引言] 我们经常需要多函数进行耗时测试,测试方法有许多,这里介绍装饰者的方法,提高耗时测试代码的可复用性,在其他方面的应用也是如此. [设计原则] 类应该对扩展开放,对修改关闭. [代码] (1)定 ...