Map接口

一、定义

Map集合是双列集合,即一个元素包含两个值(一个key,一个value),Collection集合是单列集合。

定义格式:

public interface Map<K,V>

二、注意事项

  • K值(key值)是不允许重复的,而且每个键只能对应一个值。
  • key值和value数据类型可以相同也可以不同。
  • V值(value值)允许重复。
  • key和value是一一对应关系。

三、常用子类

  • HashMap

  • LinkedHashMap

HashMap

1.注意事项

  1. 底层使用哈希表。HashSet集合本质new的就是HashMap的对象,只不过它只利用了它的单列K(key)值,这也是HashSet集合不允许重复值的根源所在。
  2. 无序集合。
  3. 不同步(多线程)。
  4. 实现了Map<K,V>接口。
  5. jdk1.8以前,哈希表结构 = 数组+链表;jdk1.8以后,哈希表结构 = 数组 + 链表(或红黑树,发生哈希冲突的元素达到8个以上)。
  6. 在存储自定义对象时,作为Key的类必须重写hashCode()方法和equals()方法,用以保证key值得唯一性。

LinkedHashMap

1.注意事项

  1. 继承自HashMap集合。
  2. LinkedHashMap结构 = 哈希表 + 链表,这保证了LinkedHashMap集合的有序性(即存放和取出元素的顺序是一致的)。

HashTable

1.注意事项

  1. 实现了 Map<K,V> 接口。
  2. 底层是哈希表。
  3. 线程同步(单线程),所以速度较慢。
  4. HashTable集合不允许存储null值,null键(其他集合均允许)。
  5. HashTable集合已经被取代了。
  6. 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集合(接口)的更多相关文章

  1. 黑马程序员——JAVA基础之Map集合

    ------- android培训.java培训.期待与您交流! ---------- Map集合: 该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 和Set很像,其实Set底层就是使用了M ...

  2. Java Collection、Map集合总结

    1.Java中的Collection集合总结 Collection |---List(存储有序,可重复) |---ArrayList 底层数据结构是数组,查询快,增删慢. 线程不安全.效率高 |--- ...

  3. Java中遍历Map集合的四种方法

    在Java中如何遍历Map对象 How to Iterate Over a Map in Java 在java中遍历Map有不少的方法.我们看一下最常用的方法及其优缺点. 既然java中的所有map都 ...

  4. 【Java进阶】---map集合排序

    map集合排序         这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题.   比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按 ...

  5. java中的Map集合

    Map接口 Map为一个接口.实现Map接口的类都有一个特点:有键值对,将键映射到值的对象. Map不能包含重复的键,每个键可以映射到最多一个值. Map常见的接口方法有: V  put(K key, ...

  6. Java——倒序输出Map集合

    package com.java.test.a; import java.util.ArrayList; import java.util.LinkedHashMap; import java.uti ...

  7. Java分享笔记:Map集合(接口)的基本方法程序演示

    package pack02; import java.util.*; public class MapDemo { public static void main(String[] args) { ...

  8. [Java基础]List,Map集合总结

    java.util包下: Collection    |--List 接口 |----ArrayList |----LinkedList |----Vector |-----Stack |---Set ...

  9. java学习笔记——Collection集合接口

    NO 方法名称 描述 1 public boolean add(E e) 向集合中保存数据 2 public void clear() 清空集合 3 public boolean contains(O ...

  10. JAVA中List,Map,Set接口的区别

    从三点来分析它们之间的不同: 1.继承的接口不同: List,Set接口都是继承于Collection接口的,而Map接口不是,它是一个顶层接口. 2.自身特点: List:用来处理序列的.对于放于的 ...

随机推荐

  1. 深入理解JS引擎的执行机制

    深入理解JS引擎的执行机制 1.灵魂三问 : JS为什么是单线程的? 为什么需要异步? 单线程又是如何实现异步的呢? 2.JS中的event loop(1) 3.JS中的event loop(2) 4 ...

  2. ASP.net MVC 构建layui管理后台(整体效果)

    登录页: 首页 模块管理 角色管理,角色分配 用户管理

  3. 【视频+图文】Java基础经典练习题(一)输出2-100之间的素数,及素数个数

    目录 第一题:判断2-100之间有多少个素数,并输出所有素数. 1.视频讲解: 2.思路分析: 代码讲解:以i=4为例 4.为大家准备了彩蛋: 能解决题目的代码并不是一次就可以写好的 我们需要根据我们 ...

  4. Python可以用中文命名

    Python中文命名 命名规则数字.字母.下划线 环境 python 3.7.3 x64 win10 现象 Python在命名的地方都是可以用中文命名 如: 变量 中文下划线无法被识别 打出中文下划线 ...

  5. 0919-The Standard of Code Review

    The primary purpose of code review is to make sure that the overall code health of Google’s code bas ...

  6. 我用STM32MP1做了个疫情监控平台2—Qt环境搭建

    目录 1.嵌入式Qt简介 2.查看开发板Qt库的版本 3.主机搭建Qt环境 4.第一个Qt程序--Hello World 5.一些问题 @ 1.嵌入式Qt简介 Qt 是一个跨平台的应用程序开发框架.使 ...

  7. maven如何安装oracle驱动jdbc的jar包

    一.因为oracle驱动的压缩包在maven官网上并没有提供,所以需要自己去手动下载. 二.下载安装步骤如下: (1)第一步:找到你本地的oracle驱动包所在位置: (2)在cmd中打开jar包所在 ...

  8. js遍历删除对象的key

    // 如果用户没有填写值,则删除对象的key. Object.keys(obj).forEach( (key) => {      if (!obj[key]) { // !obj[key]表示 ...

  9. 告别炼丹,Google Brain提出强化学习助力Neural Architecture Search | ICLR2017

    论文为Google Brain在16年推出的使用强化学习的Neural Architecture Search方法,该方法能够针对数据集搜索构建特定的网络,但需要800卡训练一个月时间.虽然论文的思路 ...

  10. CSS躬行记(1)——CSS基础拾遗

    一.box-decoration-break CSS3新增的box-decoration-break属性可指定行内非替换元素在跨行.跨列或跨页时的样式渲染,它包含两个值: (1)slice:默认值,盒 ...