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. onOK Modal.warning iview 要写一个函数 套上,不然会得不到异步调用,直接弹出的时候就执行了

    export const warning = (str, callback = _ => {}, outCallback = () => {}) => { Modal.warning ...

  2. 【分布式锁】02-使用Redisson实现公平锁原理

    前言 前面分析了Redisson可重入锁的原理,主要是通过lua脚本加锁及设置过期时间来保证锁执行的原子性,然后每个线程获取锁会将获取锁的次数+1,释放锁会将当前锁次数-1,如果为0则表示释放锁成功. ...

  3. 我在使用DriverManager时发现的问题

    小白今天在连接数据库的时候,心里面突然想起之前有大佬说没有必要添加一条"com.mysql.jdbc.Driver",当时也实验了确实可行,但是这个可是驱动地址,难道是不用添加是根 ...

  4. 2020年启蒙及小学识字练字APP或小程序测评榜

    语文教学改革后,小学识字练字方面显得越来越重要.而市场上大大小小的识字练字应用琳琅满目,不同的定位,不同的核心功能,不同的费用.应该怎么选呢? 本篇将从多个角度对主流识字练字应用进行评测,评估对象为主 ...

  5. 浅谈ASP.NET Core中的DI

    DI的一些事 传送门马丁大叔的文章 什么是依赖注入(DI: Dependency Injection)?     依赖注入(DI)是一种面向对象的软件设计模式,主要是帮助开发人员开发出松耦合的应用程序 ...

  6. Minio 集群扩容存储空间,配合nginx 负载反向代理后端minio 集群服务器,提升高可用性

    环境:Centos  7 软件:minio,Etcd 需求:通过联盟两个集群实例,实现水平扩容存储空间问题: 服务器使用阿里云,一共4台服务器(官方说明最好4台服务器做分布式,测试节省服务器所以我们使 ...

  7. Java 14 发布了,再也不怕 NullPointerException 了!

    2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 358: Helpful NullPoint ...

  8. 阿里云服务器Ubuntu系统搭建LNMP环境

    目录 一.Nginx 安装 二.MySQL安装 三.PHP安装 四.配置Nginx 五.环境测试 六.服务器常用路径 一.Nginx 安装 更新软件源 sudo apt-get update 安装 N ...

  9. css清除浮动影响

    将清除浮动代码添加到重置样式表中,随时可以调用 }}.clearfix:after{clear:both} 给需要清除浮动影响的元素添加class名 --- clearfix 例: <!-- c ...

  10. effective-java学习笔记---静态工厂方法替代构造方法

    使用静态方法的优点: 1.它们是有名字的,生成的客户端代码更易阅读. 如:返回素数的静态方法 BigInteger.probablePrime 2.与构造方法不同,它们不需要每次调用时都创建一个对象. ...