--Map接口简介

  今天来看一看map集合,map映射接口,用于存放键值对,<key,value>,通过key来查找value,顾名思义key不能为空,唯一且不重复,不然底层怎么查呢!

  可以从图中看出Map为单独的接口,他和Collection有什么区别呢?

  • Map和Collection在集合中并列存在。 
  • Map集合是双列的,键值对,而Collection是单列集合
  • Map存储元素使用put方法,Collection使用Put方法。
  • Map遍历没有直接取出元素的方法,而是先转成Set集合,再通过迭代获取元素。

 --Map常用方法

  

--Map应用

  • 添加:使用HashMap。立了学生姓名和年龄之间的映射关系。并试图添加重复的键

       public static void main(String[] args) {
    // 定义一个Map的容器对象
    Map<String, Integer > map1 = new HashMap<String, Integer >();
    map1.put("jack", 20);
    map1.put("rose", 18);
    map1.put("lucy", 17);
    map1.put("java", 25);
    // map1.put("jack", 30); 在没有hashCode和equals方式 添加重复的键值(值不同),会覆盖掉前面key值相同的值
    System.out.println(map1); Map<String, Integer> map2 = new HashMap<String, Integer>();
    map2.put("张三丰", 100);
    map2.put("虚竹", 20);
    System.out.println("map2:" + map2);
    // 从指定映射中将所有映射关系复制到此映射中。
    map1.putAll(map2);
    System.out.println("map1:" + map1);
    }
  • 删除:
       public static void main(String[] args) {
       // 删除:
    // remove() 删除关联对象,指定key对象
    // clear() 清空集合对象 Map<String, Integer> map1 = new HashMap<String, Integer>();
    map1.put("jack", 20);
    map1.put("rose", 18);
    map1.put("lucy", 17);
    map1.put("java", 25);
    System.out.println(map1);
    // 指定key,返回删除的键值对映射的值。
    map1.remove("java");
    System.out.println(map1);
    map1.clear();
    System.out.println("map1:" + map1);
    }
  • 获取:

    public static void main(String[] args) {
    // 获取:
    // V get(Object key) 通过指定的key对象获取value对象
    // int size() 获取容器的大小
    Map<String, Integer> map1 = new HashMap<String, Integer>();
    map1.put("jack", 20);
    map1.put("rose", 18);
    map1.put("lucy", 17);
    map1.put("java", 25);
    System.out.println(map1);
    // V get(Object key) 通过指定的key对象获取value对象
    System.out.println("value:" + map1.get("jack"));
    // int size() 获取容器的大小
    System.out.println("map.size:" + map1.size());
    }
  • 判断:
    public static void main(String[] args) {
    // 判断:
    // boolean isEmpty() 判断集合是否为空 长度为0返回true否则false
    // boolean containsKey(Object key) 判断集合中是否包含指定的key
    // boolean containsValue(Object value) Map<String, Integer> map1 = new HashMap<String, Integer>();
    map1.put("jack", 20);
    map1.put("rose", 18);
    map1.put("lucy", 17);
    map1.put("java", 25);
    System.out.println(map1);
    System.out.println("isEmpty:" + map1.isEmpty());
    System.out.println("containskey:" + map1.containsKey("jack"));
    System.out.println("containsvalues:" + map1.containsValue(100));
    }

    遍历Map的4中方式:

  • 第一种:
    public static void main(String[] args) {
    //遍历Map 第一种方式
    Map<String, Integer> map1 = new HashMap<String, Integer>();
    map1.put("jack", 20);
    map1.put("rose", 18);
    map1.put("lucy", 17);
    map1.put("java", 25); //通过 map1.keySet() 获取key 通过key 找到value
    for (String key : map1.keySet()) {
    Integer value = map1.get(key);
    System.out.println("key : "+key+" value : "+value);
    }
    }
  • 第二种:
    public static void main(String[] args) {
    //遍历Map 第二种方式
    Map<String, Integer> map1 = new HashMap<String, Integer>();
    map1.put("jack", 20);
    map1.put("rose", 18);
    map1.put("lucy", 17);
    map1.put("java", 25); //通过Map.Entry(String,Integer) 获取,然后使用entry.getKey()获取到键,通过entry.getValue()获取到值
    for(Map.Entry<String, Integer> entry : map1.entrySet()){
    System.out.println("键 key :"+entry.getKey()+" 值value :"+entry.getValue());
    }
    }
  • 第三种:
    //遍历Map 第三种方式
    Map<String, Integer> map1 = new HashMap<String, Integer>();
    map1.put("jack", 20);
    map1.put("rose", 18);
    map1.put("lucy", 17);
    map1.put("java", 25);
    //第三种只遍历键或者值,通过加强for循环
    for(String s1:map1.keySet()){//遍历map的键
    System.out.println("键key :"+s1);
    }
    for(Integer s2:map1.values()){//遍历map的值
    System.out.println("值value :"+s2);
    }
    System.out.println("====================================");
    }
  • 第四种:

    public static void main(String[] args) {
    //遍历Map 第一种方式
    Map<String, Integer> map1 = new HashMap<String, Integer>();
    map1.put("jack", 20);
    map1.put("rose", 18);
    map1.put("lucy", 17);
    map1.put("java", 25); //第四种Iterator遍历获取,然后获取到Map.Entry<String, String>,再得到getKey()和getValue()
    Iterator<Map.Entry<String, Integer>> it=map1.entrySet().iterator();
    while(it.hasNext()){
    Map.Entry<String, Integer> entry=it.next();
    System.out.println("键key :"+entry.getKey()+" value :"+entry.getValue());
    } }

    HashMap

  • 底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。要保证键的唯一性,需要覆盖hashCode方法,和equals方法。

    案例:自定义对象作为Map的键。

    public class Demo3 {
public static void main(String[] args) {
HashMap<Person, String> hm = new HashMap<Person, String>();
hm.put(new Person("jack", 20), "1001");
hm.put(new Person("rose", 18), "1002");
hm.put(new Person("lucy", 19), "1003");
hm.put(new Person("hmm", 17), "1004");
hm.put(new Person("ll", 25), "1005");
System.out.println(hm);
System.out.println(hm.put(new Person("rose", 18), "1006")); //重写hashCode和equalse后key相同不会覆盖 Set<Entry<Person, String>> entrySet = hm.entrySet();
Iterator<Entry<Person, String>> it = entrySet.iterator();
while (it.hasNext()) {
Entry<Person, String> next = it.next();
Person key = next.getKey();
String value = next.getValue();
System.out.println(key + " = " + value);
}
}
} class Person {
private String name;
private int age; Person() { } public Person(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public int hashCode() { return this.name.hashCode() + age * 37;
} @Override
public boolean equals(Object obj) {
if (obj instanceof Person) {
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
} else {
return false;
}
} @Override
public String toString() { return "Person@name:" + this.name + " age:" + this.age;
} }
}

TreeMap

  TreeMap的排序,TreeMap可以对集合中的键进行排序。如何实现键的排序?

  方式一:元素自身具备比较性

  和TreeSet一样原理,需要让存储在键位置的对象实现Comparable接口,重写compareTo方法,也就是让元素自身具备比较性,这种方式叫做  元素的自然排序也叫做默认排序。

  方式二:容器具备比较性

  当元素自身不具备比较性,或者自身具备的比较性不是所需要的。那么此时可以让容器自身具备。需要定义一个类实现接口Comparator,重  写compare方法,并将该接口的子类实例对象作为参数传递给TreeMap集合的构造方法。

  注意:当Comparable比较方式和Comparator比较方式同时存在时,以Comparator的比较方式为主;

  注意:在重写compareTo或者compare方法时,必须要明确比较的主要条件相等时要比较次要条件。(假设姓名和年龄一致的人为相同的人,  如果想要对人按照年龄的大小来排序,如果年龄相同的人,需要如何处理?不能直接return 0,以为可能姓名不同(年龄相同姓名不同的人  是不同的人)。此时就需要进行次要条件判断(需要判断姓名),只有姓名和年龄同时相等的才可以返回0.)

  通过return 0来判断唯一性。

    public class Demo4 {
public static void main(String[] args) {
TreeMap<String, Integer> tree = new TreeMap<String, Integer>();
tree.put("张三", 19);
tree.put("李四", 20);
tree.put("王五", 21);
tree.put("赵六", 22);
tree.put("周七", 23);
tree.put("张三", 24);
System.out.println(tree);
System.out.println("张三".compareTo("李四"));//-2094
}
}

自定义元素排序

    public class Demo3 {
public static void main(String[] args) {
TreeMap<Person, String> hm = new TreeMap<Person, String>(
new MyComparator());
hm.put(new Person("jack", 20), "1001");
hm.put(new Person("rose", 18), "1002");
hm.put(new Person("lucy", 19), "1003");
hm.put(new Person("hmm", 17), "1004");
hm.put(new Person("ll", 25), "1005");
System.out.println(hm);
System.out.println(hm.put(new Person("rose", 18), "1006")); Set<Entry<Person, String>> entrySet = hm.entrySet();
Iterator<Entry<Person, String>> it = entrySet.iterator();
while (it.hasNext()) {
Entry<Person, String> next = it.next();
Person key = next.getKey();
String value = next.getValue();
System.out.println(key + " = " + value);
}
}
} class MyComparator implements Comparator<Person> { @Override
public int compare(Person p1, Person p2) {
if (p1.getAge() > p2.getAge()) {
return -1;
} else if (p1.getAge() < p2.getAge()) {
return 1;
}
return p1.getName().compareTo(p2.getName());
} } class Person implements Comparable<Person> {
private String name;
private int age; Person() { } public Person(String name, int age) { this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public int hashCode() { return this.name.hashCode() + age * 37;
} @Override
public boolean equals(Object obj) {
if (obj instanceof Person) {
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
} else {
return false;
}
} @Override
public String toString() { return "Person@name:" + this.name + " age:" + this.age;
} @Override
public int compareTo(Person p) { if (this.age > p.age) {
return 1;
} else if (this.age < p.age) {
return -1;
}
return this.name.compareTo(p.name);
} }

注意:Set的元素不可重复,Map的键不可重复,如果存入重复元素如何处理

Set元素重复元素不能存入add方法返回false

Map的重复健将覆盖旧键,将旧值返回。

java基础集合简介Map(三)下的更多相关文章

  1. java基础集合简介Set(三)中

    今天主要说夏set集合,每天抽出一个小时总结下,生活会更加美好! --< java.util >-- Set接口: 数据结构:数据的存储方式: Set接口中的方法和Collection中方 ...

  2. java基础集合简介List/Vector(三)上

    集合特点: 1:对象封装数据,对象多了也需要存储.集合用于存储对象. 2:集合是可变长度的. 集合和数组的区别: 1:数组是固定长度的:集合可变长度的. 2:数组可以存储基本数据类型,也可以存储引用数 ...

  3. JAVA基础-集合(二)

    一.Map整体结构体系 Map是集合的另一大派系,与Collection派系不同的是Map集合是以键值对儿的形式存储在集合的.两个键为映射关系,其中第一个键为主键(主键是唯一的不可重复),第二个键为v ...

  4. Java基础-集合的嵌套

    Java基础-集合的嵌套 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.静态导入 静态导入是在JDK1.5后的新特性,可以减少开发的代码量,但是实际用处是很一般,静态导入的标准 ...

  5. Java基础类库简介

    Java基础类库简介 一.常用的基础类库:11个jar(Java Archive,Java归档)包 作为java语言使用者,我们可以感受到java语言带来的优势(平台无关.面向对象.多线程.高效易扩展 ...

  6. JAVA基础知识之Map集合

    Map的内部结构Entry Set与Map的关系 Map的内部类Entry Map的通用方法及Map的简单用法 HashMap和HashTable的区别 HashMap和HashTable判断元素相等 ...

  7. Java基础——集合框架

    Java的集合框架是Java中很重要的一环,Java平台提供了一个全新的集合框架.“集合框架”主要由一组用来操作对象的接口组成.不同接口描述一组不同数据类型.Java平台的完整集合框架如下图所示: 上 ...

  8. Java基础---集合

    第一讲    集合框架 先看下面的图: 这就是集合框架的构成.由于数据结构的不同,有不同的集合,也叫容器.下面是集合类的简单介绍. 一.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所 ...

  9. Java基础扫盲系列(三)— Java内省技术

    前言 Java内省技术属于Java基础体系的的一部分,但是很多人都不甚了解.笔者也是在学习Spring源码的过程中遇到该技术模块的.为了完善技术体系,本文将全面的学习该技术.在提到Java内省技术,就 ...

随机推荐

  1. [UWP]用Win2D和CompositionAPI实现文字的发光效果,并制作动画

    1. 成果 献祭了周末的晚上,成功召唤出了上面的番茄钟.正当我在感慨"不愧是Shadow大人,这难道就是传说中的五彩斑斓的黑?" "那才不是什么阴影效果,那是发光效果.& ...

  2. 读写分离很难吗?springboot结合aop简单就实现了

    目录 前言 环境部署 开始项目 注意 參考: 前言 入职新公司到现在也有一个月了,完成了手头的工作,前几天终于有时间研究下公司旧项目的代码.在研究代码的过程中,发现项目里用到了Spring Aop来实 ...

  3. 2019-9-9:渗透测试,基础学习,phpmyadmin getshell方法,基于时间的盲注,基于报错的注入,笔记

    phpmyadmin getshell方法1,查看是否有导入导出设置 show global variables like '%secure-file-priv%';2,如果secure-file-p ...

  4. 极化码之tal-vardy算法(1)

    继前两节我们分别探讨了极化码的编码,以及深入到高斯信道探讨高斯近似法之后,我们来关注一个非常重要的极化码构造算法.这个算法并没有一个明确的名词,因此我们以两位发明者的名字将其命名为“Tal-Vardy ...

  5. 06-kubernetes service

    目录 Service ClusterIP 有头 Service 无头 Service Service 说明: Service 是作用于客户端可服务端(Pod)之间,作为一个固定的中间层 主要依赖于ku ...

  6. C语言I作业10

    问题 回答 这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-2/homework/10100 我在 ...

  7. tp5判断多模块下访问PC端和手机端

    现在很多网站的手机端和PC端都是分开的模块,这是问题就来了,有些手机端的用户输入了PC端的网址,直接访问了PC端.下面我教大家如何实现手机端用户访问PC时,跳转回手机端. 解决方法:把下面的代码放到公 ...

  8. Javascript实现百度API

    百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富.交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HTML5特 ...

  9. 漫谈LiteOS之开发板-GPIO(基于GD32450i-EVAL)

    [摘要] 本文主要从GPIO的定义.工作模式.特色.工作场合.以及GD32450i-EVAL开发板的引脚.对应的寄存器以及GPIO的流水灯示例对GPIO加以介绍,希望对你有所帮助. 1定义 GPIO( ...

  10. Python中的Tcp协议的应用之Tcp服务端程序开发

    TCP通信协议是面向连接的可靠的网络通信协议. 网络间想要进行数据传输必须要用到socket,socket翻译过来叫做套接字,其主要作用是不同设备或同一台设备之间的进程通信工具. Python中的Tc ...