Java第二十天,Map集合(接口)
Map接口
一、定义
Map集合是双列集合,即一个元素包含两个值(一个key,一个value),Collection集合是单列集合。
定义格式:
public interface Map<K,V>
二、注意事项
- K值(key值)是不允许重复的,而且每个键只能对应一个值。
- key值和value数据类型可以相同也可以不同。
- V值(value值)允许重复。
- key和value是一一对应关系。
三、常用子类
HashMap
LinkedHashMap
HashMap
1.注意事项
- 底层使用哈希表。HashSet集合本质new的就是HashMap的对象,只不过它只利用了它的单列K(key)值,这也是HashSet集合不允许重复值的根源所在。
- 无序集合。
- 不同步(多线程)。
- 实现了Map<K,V>接口。
- jdk1.8以前,哈希表结构 = 数组+链表;jdk1.8以后,哈希表结构 = 数组 + 链表(或红黑树,发生哈希冲突的元素达到8个以上)。
- 在存储自定义对象时,作为Key的类必须重写hashCode()方法和equals()方法,用以保证key值得唯一性。
LinkedHashMap
1.注意事项
- 继承自HashMap集合。
- LinkedHashMap结构 = 哈希表 + 链表,这保证了LinkedHashMap集合的有序性(即存放和取出元素的顺序是一致的)。
HashTable
1.注意事项
- 实现了 Map<K,V> 接口。
- 底层是哈希表。
- 线程同步(单线程),所以速度较慢。
- HashTable集合不允许存储null值,null键(其他集合均允许)。
- HashTable集合已经被取代了。
- HashTable集合的子类 Properties 集合依然被广泛使用,因为它是唯一一个和I/O流配合的集合。
四、使用方法
1.Map接口
(1)常用方法
pubilc V put(K key,V value)
注意:
如果key值已经存在,则返回被替换的value值,如果key值不存在,则返回空。
当添加的键值已经存在时,value值会被新值替换,而并非添加失败。
public V remove(K key)
根据键值删除对应的对值,并且返回被删除掉的键值对应的value值。
pubilc V get(K key)
得到指定键值对应的value值。
public boolean containsKey(K key)
判断集合中是否存在键值 key
public boolean containValue(V value)
判断集合中是否存在value值 value
(2)测试代码:
Tea类:
package com.lanyue.day19;
public class Tea {
public int grade;
public String name;
public String school;
public Tea(int grade, String name, String school) {
this.grade = grade;
this.name = name;
this.school = school;
}
@Override
public String toString() {
return name;
}
public void info(){
System.out.println(this.name + "是" + this.school + this.grade +"年级的班主任");
}
}
Stu类:
package com.lanyue.day19;
public class Stu {
public int grade;
public String name;
@Override
public String toString() {
return name;
}
public String school;
public Stu(int grade, String name, String school) {
this.grade = grade;
this.name = name;
this.school = school;
}
public void info(){
System.out.println(this.name + "同学目前就读于" + this.school + "的" + this.grade + "年级");
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Stu stu = (Stu) o;
return Objects.equals(name, stu.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
运行类:
package com.lanyue.day19;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;
public class MapLearn {
public static void main(String[] args) {
Map<Stu,Tea> map = new HashMap<>();
Tea teaOne = new Tea(1,"张晓燕","黄冈中学");
Tea teaTwo = new Tea(2,"李艳玲","黄冈中学");
Tea teaThree = new Tea(3,"王建福","黄冈中学");
Stu stuOne = new Stu(1,"小明","黄冈中学");
Stu stuTwo = new Stu(1,"小力","黄冈中学");
Stu stuThree = new Stu(1,"小张","黄冈中学");
Stu stuFour = new Stu(2,"晓明","黄冈中学");
Stu stuFive = new Stu(2,"晓力","黄冈中学");
Stu stuSix = new Stu(2,"晓张","黄冈中学");
Stu stuSeven = new Stu(3,"萧明","黄冈中学");
Stu stuEight = new Stu(3,"萧力","黄冈中学");
Stu stuNine = new Stu(3,"萧张","黄冈中学");
Stu stuTen = new Stu(3,"萧何","黄冈中学");
map.put(stuOne,teaOne);
map.put(stuTwo,teaOne);
map.put(stuThree,teaOne);
map.put(stuFour,teaTwo);
map.put(stuFive,teaTwo);
map.put(stuSix,teaTwo);
map.put(stuSeven,teaThree);
map.put(stuEight,teaThree);
map.put(stuNine,teaThree);
map.put(stuTen,teaThree);
Tea tea = map.put(stuEight,teaOne);
System.out.println(tea);
tea = map.get(stuEight);
System.out.println(tea);
tea = map.remove(stuEight);
System.out.println(tea);
boolean b1 = map.containsKey(stuEight);
boolean b2 = map.containsValue(teaThree);
System.out.println(b1 + " " + b2);
System.out.println(map);
}
}
2.遍历Map集合
方法一:
Map中有一个方法:
public K keySet(Map<K,V> map)
这个方法返回一个Set视图(即将双列Map集合中的K列装换为单列Set接口,并将其实现类对象返回),可以利用Set接口遍历集合中的所有K元素(键值),然后再利用Map中的get(K key)方法得到每个key值对应的value值,如此得以遍历整个集合。
方法二:
在Map接口中有一个内部接口——Entry接口。
一旦Map实现类对象创建, 就会生成一个Entry实现类对象 ==> 。用于生成键值对对象(它是一个整体对象,对象中又包含两个子对象,分别是key对象和value对象)
步骤:
①
Set<Map.Entry<K,Y>> Set对象 = Map对象.entrySet();
②
Iterator<Map.Entry<K,Y>> 迭代器对象 = Set对象.iterator();
③
然后利用迭代器对象得到所有的Entry对象。
④
对每个Entry对象进行getKey()和getValue()方法最终得到所有的key,value对象。
注意:完成①后,就可以使用增强for循环来遍历所有对象了。
测试代码:
Stu类代码:
package com.lanyue.day19;
import java.util.Objects;
public class Stu {
public int grade;
public String name;
@Override
public String toString() {
return name;
}
public String school;
public Stu(int grade, String name, String school) {
this.grade = grade;
this.name = name;
this.school = school;
}
public void info(){
System.out.println(this.name + "同学目前就读于" + this.school + "的" + this.grade + "年级");
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Stu stu = (Stu) o;
return Objects.equals(name, stu.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
Tea代码类:
package com.lanyue.day19;
public class Tea {
public int grade;
public String name;
public String school;
public Tea(int grade, String name, String school) {
this.grade = grade;
this.name = name;
this.school = school;
}
@Override
public String toString() {
return name;
}
public void info(){
System.out.println(this.name + "是" + this.school + this.grade +"年级的班主任");
}
}
运行代码类:
package com.lanyue.day19;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapLearn {
public static void main(String[] args) {
Map<Stu,Tea> map = new HashMap<>();
Tea teaOne = new Tea(1,"张晓燕","黄冈中学");
Tea teaTwo = new Tea(2,"李艳玲","黄冈中学");
Tea teaThree = new Tea(3,"王建福","黄冈中学");
Stu stuOne = new Stu(1,"小明","黄冈中学");
Stu stuTwo = new Stu(1,"小力","黄冈中学");
Stu stuThree = new Stu(1,"小张","黄冈中学");
Stu stuFour = new Stu(2,"晓明","黄冈中学");
Stu stuFive = new Stu(2,"晓力","黄冈中学");
Stu stuSix = new Stu(2,"晓张","黄冈中学");
Stu stuSeven = new Stu(3,"萧明","黄冈中学");
Stu stuEight = new Stu(3,"萧力","黄冈中学");
Stu stuNine = new Stu(3,"萧张","黄冈中学");
Stu stuTen = new Stu(3,"萧何","黄冈中学");
map.put(stuOne,teaOne);
map.put(stuTwo,teaOne);
map.put(stuThree,teaOne);
map.put(stuFour,teaTwo);
map.put(stuFive,teaTwo);
map.put(stuSix,teaTwo);
map.put(stuSeven,teaThree);
map.put(stuEight,teaThree);
map.put(stuNine,teaThree);
map.put(stuTen,teaThree);
view(map);
viewTwo(map);
}
public static void view(Map<Stu,Tea> map){
Set<Stu> stuSet = map.keySet();
Iterator<Stu> it = stuSet.iterator();
while(it.hasNext()){
Stu stu = it.next();
Tea tea = map.get(stu);
System.out.println(stu.school + "" + stu.grade + "班" + stu.name + "===>" + tea.school + "的" + tea.grade + "班" + tea
.name);
}
}
public static void viewTwo(Map<Stu,Tea> map){
Set<Map.Entry<Stu, Tea>> list = map.entrySet();
Iterator<Map.Entry<Stu, Tea>> it = list.iterator();
while(it.hasNext()){
Map.Entry<Stu, Tea> mapTemp = it.next();
Stu stu = mapTemp.getKey();
Tea tea = mapTemp.getValue();
System.out.println(stu.school + "" + stu.grade + "班" + stu.name + "------>>" + tea.school + "的" + tea.grade + "班" + tea
.name);
}
}
}
3.LinkedHashMap
package com.lanyue.day19;
import java.util.Collections;
import java.util.LinkedHashMap;
public class LinkedHashMapLearn {
public static void main(String[] args) {
LinkedHashMap<Integer,String> list = new LinkedHashMap<>();
list.put(3,"三");
list.put(4,"四");
list.put(5,"五");
list.put(1,"一");
list.put(2,"二");
System.out.println(list);
}
}
Java第二十天,Map集合(接口)的更多相关文章
- 黑马程序员——JAVA基础之Map集合
------- android培训.java培训.期待与您交流! ---------- Map集合: 该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 和Set很像,其实Set底层就是使用了M ...
- Java Collection、Map集合总结
1.Java中的Collection集合总结 Collection |---List(存储有序,可重复) |---ArrayList 底层数据结构是数组,查询快,增删慢. 线程不安全.效率高 |--- ...
- Java中遍历Map集合的四种方法
在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...
- 【Java进阶】---map集合排序
map集合排序 这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题. 比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按 ...
- java中的Map集合
Map接口 Map为一个接口.实现Map接口的类都有一个特点:有键值对,将键映射到值的对象. Map不能包含重复的键,每个键可以映射到最多一个值. Map常见的接口方法有: V put(K key, ...
- Java——倒序输出Map集合
package com.java.test.a; import java.util.ArrayList; import java.util.LinkedHashMap; import java.uti ...
- Java分享笔记:Map集合(接口)的基本方法程序演示
package pack02; import java.util.*; public class MapDemo { public static void main(String[] args) { ...
- [Java基础]List,Map集合总结
java.util包下: Collection |--List 接口 |----ArrayList |----LinkedList |----Vector |-----Stack |---Set ...
- java学习笔记——Collection集合接口
NO 方法名称 描述 1 public boolean add(E e) 向集合中保存数据 2 public void clear() 清空集合 3 public boolean contains(O ...
- JAVA中List,Map,Set接口的区别
从三点来分析它们之间的不同: 1.继承的接口不同: List,Set接口都是继承于Collection接口的,而Map接口不是,它是一个顶层接口. 2.自身特点: List:用来处理序列的.对于放于的 ...
随机推荐
- nodeJS中定时任务cron的使用
cron模块可以帮助我们在node中定时执行任务.如果你的定时需求是简单的setInterval()与setTimeout()计时器所无法满足的比较复杂的定时规则,推荐使用cron来配置. 安装cro ...
- The Game Of Life – 数据结构与算法的敲门砖
The Game Of Life(生命游戏,又称为细胞自动机)几乎是所有数据结构与算法导论教程前言的一个很经典的程序了.这是一个零玩家游戏,发生在一个平面网格里.每个格子的细胞都有死亡和存活两种状态, ...
- 深度学习与人类语言处理-语音识别(part3)
上节回顾深度学习与人类语言处理-语音识别(part2),这节课我们接着看seq2seq模型怎么做语音识别 上节课我们知道LAS做语音识别需要看完一个完整的序列才能输出,把我们希望语音识别模型可以在听到 ...
- 【Weiss】【第03章】队列例程
前几个例程还是相当简单的,把链表即时改了一下就是队列了. 还有想了一下,决定这种例程的代码放法是:先把测试代码默认折叠放在前面,然后把实现代码默认展开放在后面. 测试代码如下: #include &l ...
- 凉鞋:我所理解的框架 【Unity 游戏框架搭建】
前言 架构和框架这些概念听起来很遥远,让很多初学者不明觉厉.会产生"等自己技术牛逼了再去做架构或者搭建框架"这样的想法.在这里笔者可以很肯定地告诉大家,初学者是完全可以去做这些事情 ...
- 「建议心心」要就来15道多线程面试题一次爽到底(1.1w字用心整理)
. 本文是给**「建议收藏」200MB大厂面试文档,整理总结2020年最强面试题库「CoreJava篇」**写的答案,所有相关文章已经收录在码云仓库:https://gitee.com/bingqil ...
- Spring框架——IOC 自动装载
IOC自动装载有两种形式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- [CVPR 2019]Normalized Object Coordinate Space for Category-Level 6D Object Pose and Size Estimation
论文地址:https://arxiv.org/abs/1901.02970 github链接:https://github.com/hughw19/NOCS_CVPR2019 类别级6D物体位姿 ...
- 欢乐C++ —— 2. 深复制与浅复制
1. 简述 通俗点讲,深复制与浅复制一般对指针而言, 深复制复制指针所指向的内容, 浅复制复制指针的值. 2. 举例 栗子: 当我们有现在有指针A指向一块数据,和指针B. 深复制- ...
- Contest 153
2019-09-14 23:16:25 总体感受:节奏尚可,难度尚可.然而还是卡在了最后一题,完全没有想到使用dp. 注意点: 1)Contest的最后一题往往是DP,Graph,这个敏感度需要提高: ...