java基础-Map集合

                                作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.Map集合概述

  我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下:

1>.Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储;

2>.Map中的集合,元素是成对存在的,每个元素是成对存在的,每个元素由键和值两部分组成,通过键可以找到对应的值;

3>Collection中的集合称为单列集合,Map中的集合称为双列集合;

4>.需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值;

5>.Map中常用的集合为HashMap集合,LinkHashMap集合;

6>.Map存储元素使用put方法,Collection使用add发明合法;

7>.Map集合没有直接取出元素的方法,而是先转成Set集合,再通过迭代获取元素;

8>.Map集合中键要保证唯一性;

二.Map接口中常用集合概述

  通过查看Map接口描述,看到Map有多个子类,我们Map集合常用类大概分为以下几种:

1>.Hashtable

  线程安全,速度慢,不允许存放null键和null值,已被HashMap替代。

2>.HashMap

  线程不安全,速度块,允许存放null键和null值。

3>.LinkedHashMap

  Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。是HashMap的链表实现(可以用IDE查看源码),由哈希表保证了键的唯一性,由链表保证了元素的存取顺序。

4>.TreeMap

  对键进行排序,排序原理 与TreeSet相同。

  注意:Map接口中的结合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。

三.Map接口中的常用方法

1>.V put(K,V)方法【将键值对存储到集合中,K作为键的对象,V作为值的对象】

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.HashMap;
import java.util.Map; public class MapDemo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
Integer i = map.put("a", 100); //第一次存储,返回值为空
System.out.println(i);
i = map.put("a", 200); //以及存在“a”这个key,因此不会写入,返回存在key所对应的value。
System.out.println(i);
map.put("b", 200);
map.put("c", 100);
map.put("d", 300);
System.out.println(map);
}
} /*
以上代码执行结果如下:
null
100
{a=200, b=200, c=100, d=300}
*/

2>.V get(K)方法【通过键对象,获取值对象】

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.HashMap;
import java.util.Map; public class MapDemo {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "yinzhengjie");
map.put(2, "尹正杰");
map.put(3, "2018");
System.out.println(map);
String res = map.get(5); //如果key在map中不存在就返回空
System.out.println(res);
res = map.get(2); //如果key在map中存在就返回具体的value
System.out.println(res);
}
} /*
以上代码执行结果如下:
{1=yinzhengjie, 2=尹正杰, 3=2018}
null
尹正杰
*/

3>.V remove(K)方法【根据指定的键删除元素,返回被删除元素的值】

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.HashMap;
import java.util.Map; public class MapDemo {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "yinzhengjie");
map.put(2, "尹正杰");
map.put(3, "2018");
String res = map.remove(3);
System.out.println(res);
res = map.remove(4);
System.out.println(res);
System.out.println(map);
}
} /*
以上代码执行结果如下:
2018
null
{1=yinzhengjie, 2=尹正杰}
*/

4>.int size()方法【返回的是map集合中的长度】

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.HashMap;
import java.util.Map; public class MapDemo {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "yinzhengjie");
map.put(2, "尹正杰");
map.put(3, "2018");
int lenth = map.size();
System.out.println(lenth);
}
} /*
以上代码执行结果如下:
3
*/

四.Map集合遍历方式

1>.KeySet方法

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set; public class MapDemo {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "yinzhengjie");
map.put(2, "尹正杰");
map.put(3, "2018"); //调用map集合的方法keySet,所有的键存储到Set集合中
Set<Integer> set = map.keySet();
//我们可以查看set类的全名,可以看出它是HashMap的内部类
System.out.println(set.getClass());
//遍历set集合,获取出Set集合中的所有元素(Map中的键)
Iterator<Integer> it = set.iterator();
while(it.hasNext()) {
//it.next()方法返回的是Set集合元素,也就是Map中的键
Integer key = it.next();
//调用map集合的get方法,通过Map中的键获取其对应的value
String value = map.get(key);
System.out.println(key + "---" + value);
}
System.out.println("---$$$$$$$$$$$$$$$$$$$$$$$---");
//增强for循环编译后其实还是迭代器形式,并且在写法上要比上面的写法要简单的多。
for (Integer key : map.keySet()) {
String value = map.get(key);
System.out.println(key + "---" + value);
}
}
} /*
以上代码执行结果如下:
class java.util.HashMap$KeySet
1---yinzhengjie
2---尹正杰
3---2018
---$$$$$$$$$$$$$$$$$$$$$$$---
1---yinzhengjie
2---尹正杰
3---2018
*/

2>.Map集合Entry对象

  在Map类设计时,提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class MapDemo {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "yinzhengjie");
map.put(2, "尹正杰");
map.put(3, "2018"); //调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合
Set<Map.Entry<Integer, String>> set = map.entrySet();
//迭代Set集合
Iterator<Entry<Integer, String>> it = set.iterator();
while(it.hasNext()) {
//获取出的Set集合的元素是映射关系,it.next()也是Map.Entry对象
Entry<Integer, String> entry = it.next();
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"---"+value);
}
System.out.println("###############################");
//注意,增强for循环(foreach)不能遍历map!下面我遍历的是集合,并非是map哟!不要被面试官忽悠了 !
for(Map.Entry<Integer,String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "..." + entry.getValue());
}
}
} /*
以上代码执行结果如下:
1---yinzhengjie
2---尹正杰
3---2018
###############################
1...yinzhengjie
2...尹正杰
3...2018
*/

五.HashMap集合存储和遍历

1>.自定义类当value时常用遍历方式

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; public class Person {
private String Name;
private int Age;
public Person() {
super();
}
public Person(String name, int age) {
super();
Name = name;
Age = age;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getAge() {
return Age;
}
public void setAge(int age) {
Age = age;
}
}

Person.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class MapDemo {
public static void main(String[] args) {
HashMap<String, Person> map = new HashMap<>();
map.put("beijing", new Person("yinzhengjie",18));
map.put("西安", new Person("尹正杰",20));
map.put("安康", new Person("邓西",25));
System.out.println("第一种遍历方式:");
for(String key : map.keySet()) {
Person value = map.get(key);
System.out.println("\t"+key + "..." + value);
}
System.out.println("第二种遍历方式:");
for (Entry<String, Person> entry : map.entrySet()) {
String key = entry.getKey();
Person value = entry.getValue();
System.out.println("\t"+key + "..." + value);
}
}
} /*
以上代码执行结果如下:
第一种遍历方式:
安康...cn.org.yinzhengjie.note3.Person@424c0bc4
beijing...cn.org.yinzhengjie.note3.Person@3c679bde
西安...cn.org.yinzhengjie.note3.Person@16b4a017
第二种遍历方式:
安康...cn.org.yinzhengjie.note3.Person@424c0bc4
beijing...cn.org.yinzhengjie.note3.Person@3c679bde
西安...cn.org.yinzhengjie.note3.Person@16b4a017
*/

2>.自定义当key时常用遍历方式

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; public class Person {
private String Name;
private int Age;
public Person() {
super();
}
public Person(String name, int age) {
super();
Name = name;
Age = age;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public int getAge() {
return Age;
}
public void setAge(int age) {
Age = age;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Age;
result = prime * result + ((Name == null) ? 0 : Name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (Age != other.Age)
return false;
if (Name == null) {
if (other.Name != null)
return false;
} else if (!Name.equals(other.Name))
return false;
return true;
} }

Person.java 文件内容

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; public class MapDemo {
public static void main(String[] args) {
HashMap<Person, String> map = new HashMap<>();
map.put(new Person("dengxi",20),"里约热内卢");
map.put(new Person("taotao",80),"索马里");
map.put(new Person("fangheyi",30),"百慕大");
map.put(new Person("yinzhengjie",65),"土耳其");
map.put(new Person("yinzhengjie",65),"土耳其");
System.out.println("第一种遍历方式:");
for(Person key : map.keySet()) {
String value = map.get(key);
System.out.println("\t"+key + "..." + value);
}
System.out.println("第二种遍历方式:");
for (Entry<Person, String> entry : map.entrySet()) {
Person key = entry.getKey();
String value = entry.getValue();
System.out.println("\t"+key + "..." + value);
}
}
} /*
以上代码执行结果如下:
第一种遍历方式:
cn.org.yinzhengjie.note3.Person@3085b5e4...百慕大
cn.org.yinzhengjie.note3.Person@f90f1314...土耳其
cn.org.yinzhengjie.note3.Person@cb7d5231...索马里
cn.org.yinzhengjie.note3.Person@b0677c98...里约热内卢
第二种遍历方式:
cn.org.yinzhengjie.note3.Person@3085b5e4...百慕大
cn.org.yinzhengjie.note3.Person@f90f1314...土耳其
cn.org.yinzhengjie.note3.Person@cb7d5231...索马里
cn.org.yinzhengjie.note3.Person@b0677c98...里约热内卢
*/

六.LinkedHashMap的特点

  linkedHashMap继承自HashMap,可以保证迭代的顺序

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.LinkedHashMap; public class LinkedHashmapDemo {
public static void main(String[] args) {
LinkedHashMap<String,Integer> link = new LinkedHashMap<>();
link.put("yinzhengjie", 18);
link.put("尹正杰", 18);
link.put("灵魂摆渡", 2018);
link.put("红海行动", 328);
link.put("神秘巨星",201712 );
link.put("摔跤吧,爸爸",201705 );
System.out.println(link);
}
} /*
以上代码执行结果如下:
{yinzhengjie=18, 尹正杰=18, 灵魂摆渡=2018, 红海行动=328, 神秘巨星=201712, 摔跤吧,爸爸=201705}
*/

七.Hashtable的特点

  Map接口实现类Hashtable,底层数据结构依然是哈希表,特点和HashMap是一样的,HashMap线程不安全的集合,运行速度尽快,Hashtable命运和Vector是一样的,从JDK1.2开始,被更先进的HashMap取代。HashMap允许存储null值,null键,Hashtable不允许存储null值,null键。

  尽管Hashtable虽然退出了历史舞台,但是它的孩子properties依然活跃在开发舞台,后期我们在说IO流是会详细介绍,这里就不介绍啦!我们可以看一下Hashtable存储null时抛出的空指针异常:

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.Hashtable;
import java.util.Map; public class HashtableDemo {
public static void main(String[] args) {
Map<String, String> map = new Hashtable<>();
map.put(null, null);
System.out.println(map);
}
} /*
以上代码执行结果如下:
Exception in thread "main" java.lang.NullPointerException
at java.base/java.util.Hashtable.put(Hashtable.java:475)
at cn.org.yinzhengjie.note3.HashtableDemo.main(HashtableDemo.java:15)
*/

八.TreeMap的特点

  基于树的Map,它的键唯一,并可以自动排序,根据使用的构造方法决定是使用元素本身可比性还是使用集合的可比性。

 /*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
EMAIL:y1053419035@qq.com
*/ package cn.org.yinzhengjie.note3; import java.util.TreeMap; public class TreeMapDemo {
public static void main(String[] args) {
TreeMap<String, Integer> tree = new TreeMap<>();
tree.put("yinzhengjie", 20);
tree.put("尹正杰", 18);
tree.put("Zhengjie", 20);
tree.put("BigData", 2018);
System.out.println(tree);
}
} /*
以上代码执行结果如下:
{BigData=2018, Zhengjie=20, yinzhengjie=20, 尹正杰=18}
*/

java基础-Map集合的更多相关文章

  1. java基础——Map集合

    Map以键值对的形式存储数据,其中Map.entry,是Map的内部类,它用来描述Map中的键值对.Map是一个接口,HashMap是他的一个实现类 Map中有几个重要的方法: get(Object ...

  2. Java基础知识:Java实现Map集合二级联动1

    Java实现Map集合二级联动 Map集合可以保存键值映射关系,这非常适合本实例所需要的数据结构,所有省份信息可以保存为Map集合的键,而每个键可以保存对应的城市信息,本实例就是利用Map集合实现了省 ...

  3. 第6节:Java基础 - 三大集合(上)

    第6节:Java基础 - 三大集合(上) 本小节是Java基础篇章的第四小节,主要介绍Java中的常用集合知识点,涉及到的内容包括Java中的三大集合的引出,以及HashMap,Hashtable和C ...

  4. 备战金三银四!一线互联网公司java岗面试题整理:Java基础+多线程+集合+JVM合集!

    前言 回首来看2020年,真的是印象中过的最快的一年了,真的是时间过的飞快,还没反应过来年就夸完了,相信大家也已经开始上班了!俗话说新年新气象,马上就要到了一年之中最重要的金三银四,之前一直有粉丝要求 ...

  5. java基础技术集合面试【笔记】

    java基础技术集合面试[笔记] Hashmap: 基于哈希表的 Map 接口的实现,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键(除了不同步和允许使用 null 之外,Ha ...

  6. Java基础之 集合体系结构(Collection、List、ArrayList、LinkedList、Vector)

    Java基础之 集合体系结构详细笔记(Collection.List.ArrayList.LinkedList.Vector) 集合是JavaSE的重要组成部分,其与数据结构的知识密切相联,集合体系就 ...

  7. JAVA基础学习-集合三-Map、HashMap,TreeMap与常用API

    森林森 一份耕耘,一份收获 博客园 首页 新随笔 联系 管理 订阅 随笔- 397  文章- 0  评论- 78  JAVA基础学习day16--集合三-Map.HashMap,TreeMap与常用A ...

  8. Java基础知识:Java实现Map集合二级联动2

    2. 定义获取省份的方法,创建一个Map集合,将上一步得到的映射集合赋值给它,使用Map集合的keySet()方法获取该集合中的所有键对象组成的Set 集合,即为省分集合,创建一个Object型一维数 ...

  9. java基础之集合:List Set Map的概述以及使用场景

    本文的整体思路以及部分文字来源:来源一 和 来源二 Java集合类的基本概念: 首先大家要明白集合为什么会出现: 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的一个很好的选择,前提是 ...

随机推荐

  1. Scrum Meeting 11.08

    成员 今日任务 明日计划 用时 徐越       赵庶宏       薄霖       卞忠昊 WebView和JavaScript交互基础 Bitmap(位图)全解析 Part1 3h  武鑫 设计 ...

  2. Scrum Meeting 11.1

    成员 今日任务 明日计划 用时 徐越 学习利用servlet上传下载文件 代码迁移 4h 赵庶宏 数据库的连接及代码学习 数据库连接 2h 武鑫 设计界面;尝试写一些初步的代码,独立完成一些简单界面 ...

  3. C++ MOOC

    相关课程列表: C++远征之起航篇 C++远征之离港篇 C++远征之封装篇 上 C++远征之封装篇 下 C++远征之继承篇 C++远征之多态篇 授课老师:james_yuan 在寒假,我主要选择 C+ ...

  4. 结对项目-四则运算出题程序(GUI版)

    目录: 一.致搭档(含项目地址) 二.PSP(planning) 三.结对编程中对接口的设计 四.计算模块接口的设计与实现过程 五.计算模块接口部分的性能改进 六.计算模块部分单元测试展示 七.计算模 ...

  5. 代码上传不到github远程仓库的经历和总结

    第二次的作业是分布式版本控制系统Git的安装与使用.一切都好端端地进行,知道最后的上传到给远程仓库时一直都上传失败.舍友也过来调试和助教的指导,依然不成功.我也上网进行了大量的翻查资料也未能成功.这是 ...

  6. Linux(Red hat)无网离线安装TensorFlow

    文件下载 首先,下载想要安装的版本,目前最新的是1.8.0 根据你的python版本下载对应的whl文件,下载连接:https://pypi.org/project/tensorflow/#files ...

  7. nigix安装

    树莓派安装nginx,参考http://blog.csdn.net/zizi7/article/details/54347223 1. 下载PCRE 并安装. 主页地址: ftp://ftp.csx. ...

  8. bootstrap使用总结

    bootstrap是一个webcss框架,集合了html/css/jquery为一家,创建响应式的页面.所谓的响应式就是适配不同的上网设备. 使用bootstrap的步骤: 1.下载bootstrap ...

  9. 关于react 官方脚手架使用出现的问题

    首先按照官网说明,一路的安装下来,很顺利,然后开始运行吧,提示个错误,缺少index.js 文件  原来是默认给出的文件是App.js 如何更改呢 找到react-script模块文件夹config下 ...

  10. Scrum 4.0(未完待续)

    看板设计: 每日例会时间定于下午放学回到宿舍,地点是在宿舍外的走廊或宿舍里,特殊情况待定: 团队开会照片: 任务认领: 首页设计-------王俊杰 鸡汤版面-------列志华 论“汤”版面---- ...