关于Map集合
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集合的更多相关文章
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...
- Java常用的几种集合, Map集合,Set集合,List集合
Java中 Object是所有类的根 Java集合常用的集合List集合.Set集合.Map集合 Map接口常用的一些方法 size() 获取集合中名值对的数量 put(key k, value v ...
- Map集合
1:Map (1)将键映射到值的对象. 一个映射不能包含重复的键:每个键最多只能映射到一个值. 键值对的方式存在 (2)Map和Collection的区别? A:Map 存储的是键值对形式的元素,键唯 ...
- MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)
一.字段名与属性名(数据库的名字)不一样怎么办? 方案一:在小配置中配置一个resultMapper <!--方案一:resultMapper 字段名与属性名不一致 --> <res ...
- Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、
特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣) ...
- java://Comparator、Comparable的用法(按照要求将map集合的键值对进行顺序输出)
import java.util.*; public class Person implements Comparable<Person>//使Person的属性具有比较性 { priva ...
- Java集合类学习笔记(Map集合)
Map用于保存具有映射关系的数据,因此Map集合里保存着两组数据,一组用于保存Map的key,一组用于保存key所对应的value. Map的key不允许重复. HashMap和Hashtable都是 ...
- java学习第18天(map集合)
Map集合是将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 存储的是键值对形式的元素,键唯一,值可以重复,有点类似于数据库中的主键加数据.主要功能有: A:添加功能 put ...
- Map集合 总结
(本人第一次写博客,部分内容有参照李刚老师的疯狂java系列图书,如有遗漏错误,请多指教,谢谢.) Java的集合类可分为Set.List.Map.Queue,其中Set.List.Queue都有共同 ...
- Map集合的应用及其遍历方式
---> HashMap :底层基于哈希表 存储原理也使用哈希表来存放的: 往HashMap添加了元素 ,首先会调用键的hashCode方法 获得一个哈希值,然后 ...
随机推荐
- 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...
- 【转】Caffe初试(九)solver及其设置
solver算是caffe的核心的核心,它协调着整个模型的运作.caffe程序运行必带的一个参数就是solver配置文件.运行代码一般为 #caffe train --solver=*_solver. ...
- 常用的HTML代码
一.文字1.标题文字 <h#>..........</h#> #=1~6:h1为最大字,h6为最小字 2.字体变化 <font>..........</fon ...
- Cocoapods - pod install 成功后找不到头文件解决
问题描述:使用Cocoapods时,import 找不到头文件. 问题原因:这是因为还没设置头文件的目录. 解决办法:在项目的Target的里设置一下,添加cocoapods头文件目录:目录路径直接写 ...
- iOS 导出 ipa 包时 四个选项的意义
iOS 导出 ipa 包时 四个选项的意义 如图 在 iOS 到处 ipa包的时候 会有四个选项 1.Save for iOS App Store Deployment 保存到本地 准备上传App ...
- “div+css”下拉菜单
<style> html, body { margin: 0; padding: 0; } .btn-group{ font-size: 14px; position: relative; ...
- mysql介绍及安装
一.MySQL介绍 1.标志 MySQL的海豚标志的名字叫"sakila",它是由MySQL AB的创始人从用户在"海豚命名"的竞赛中建议的大量的名字表中选出的 ...
- BI项目记笔记索引
这个笔记系列主要记录了在BI项目中,如何搭建环境进行源代码管理以及文档管理. 用到的产品包括: TFS Express Sharepoint Visual Studio SQL Server 配置 ...
- [UWP]UWP中获取联系人/邮件发送/SMS消息发送操作
这篇博客将介绍如何在UWP程序中获取联系人/邮件发送/SMS发送的基础操作. 1. 获取联系人 UWP中联系人获取需要引入Windows.ApplicationModel.Contacts名称空间. ...
- OpenCv ROI操作
Mat img, dst; Rect imgroi(, , img.cols, img.rows);//小图像img需要复制到大图的像素区域rect Rect dstroi(, , img.cols, ...