java基础集合简介Map(三)下

From: https://www.cnblogs.com/douyu2580860/p/8358768.html

 

--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 找到valuefor (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来判断唯一性。

1

2

3

4

5

6

7

8

9

10

11

12

13

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的重复健将覆盖旧键,将旧值返回。

 

技术交流群,海量学习资料免费获取,备注来意:就说博客上看到的, Q群:289683917

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从getmemery()函数看内存管理、函数传参等一系列问题

在C 面试题目中&#xff0c;会经常出现getmemery()函数的改错题&#xff0c;比如下面这道题&#xff0c; 例一&#xff1a;代码如下&#xff1a; [cpp] view plaincopy #include <stdio.h> char *getmemery() { char p[] "hello world!"; …

Java中array、List、Set互相转换

From: https://www.cnblogs.com/yysbolg/p/9977365.html 数组转List String[] staffs new String[]{"A", "B", "C"}; List staffsList Arrays.asList(staffs);//注意: Arrays.asList() 返回一个受指定数组决定的固定大小的列表。所以不能做 a…

Apache Shiro 使用手册(三)Shiro 授权

授权即访问控制&#xff0c;它将判断用户在应用程序中对资源是否拥有相应的访问权限。 如&#xff0c;判断一个用户有查看页面的权限&#xff0c;编辑数据的权限&#xff0c;拥有某一按钮的权限&#xff0c;以及是否拥有打印的权限等等。 一、授权的三要素授权有着三个核心元素…

UVa 10026 - Shoemaker's Problem

题目大意&#xff1a;鞋匠有n个任务&#xff0c;第i个任务要花费ti天&#xff0c;同时第i个任务每耽误一天要有fi的罚金。求完成所有任务的最小罚金。 虽然知道是贪心&#xff0c;可是并不确定如何作贪心选择&#xff0c;只好“取经”了...假如有两个任务i和j&#xff0c;先做i…

在VS2012中实现Ext JS的智能提示太简单了

Visual Studio 2012太强大了&#xff0c;居然能自己会去提取Ext JS的类的属性和方法&#xff0c;从而实现只能提示。下面就来介绍一下实现这个功能。在Visual Studio 2012中随便创建一个Web项目&#xff0c;我创建了一个空的Web项目&#xff0c;目录结构如下图所示&#xff1a;…

mybatis 查询之神坑

先看一个示例&#xff1a; 数据表数据&#xff1a; mybatis类和查询语句&#xff1a; 1. 当UserInfoMap中所有字段(包含association)都为NULL的话&#xff0c;getUserInfo的返回结果是个null&#xff0c;即使查询的记录存在&#xff01;运行结果如下&#xff1a; 2019-06-26 …

微软万圣节文件

为什么80%的码农都做不了架构师&#xff1f;>>> http://www.aka.org.cn/Docs/halloween/halloweenDoc.html 微软万圣节文件 圣节文件在微软以外被用作称呼一系列来源可靠的备忘录&#xff0c;内容是微软总部用来对付开源软件&#xff08;特别是Linux&#xff09;的…

linux C 学习 简单字符串逆序输出

看了下网上的字符串逆序输出&#xff0c;都相对复杂&#xff0c;下面给一个简单的字符串逆序输出小程序实现: [cpp] view plaincopy #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int i; int n; …

【干货分享】流程DEMO-补打卡

流程名&#xff1a; 补打卡申请 业务描述&#xff1a; 当员工在该出勤的工作日出勤但漏打卡时&#xff0c;于一周内填写补打卡申请。 流程相关文件&#xff1a; 流程包.xml 流程说明&#xff1a; 直接导入流程包文件&#xff0c;即可使用本流程 表单&#xff1a; 流程&#xf…

2019年最流行的10个前端框架

From: http://blog.sina.com.cn/s/blog_18337e9c40102yt1x.html &#xfeff;2019年最流行的10个前端框架 从去年下半年开始&#xff0c;互联网行业慢慢进入寒冬&#xff0c;一些设计师也不得不重新找工作。关于求职这个事情&#xff0c;UI黑客之前写过一篇文章《面试了50多位…

Linux C 中断言assert()使用简介

assert()是一个调试程序时经常使用的宏&#xff0c;在程序运行时它计算括号内的表达式&#xff0c;如果表达式为FALSE (0), 程序将报告错误&#xff0c;并终止执行。如果表达式不为0&#xff0c;则继续执行后面的语句&#xff0c;它的作用是终止程序以免导致严重后果&#xff0…

SQL中group by的用法

group by即按照给定字段对结果集进行分组&#xff0c;从字面意义上理解就是根据“by”指定的规则对数据进行分组&#xff0c;所谓的分组就是将一个“数据集”划分成若干个“小区域”&#xff0c;然后针对若干个“小区域”进行数据处理。 group by的写法&#xff1a; 1.select 字…

Linux C 数据结构---链表(单向链表)

上一篇我们讲到了线性表&#xff0c;线性表就是数据元素都一一对应&#xff0c;除只有唯一的前驱&#xff0c;唯一的后继。 线性表存储结构分为顺序存储、链式存储。 顺序存储的优点&#xff1a; 顺序存储的缺点&#xff1a; 链表就是典型的链式存储&#xff0c;将线性表L &am…

前端学PHP之文件操作(认真读读)

前面的话 在程序运行时&#xff0c;程序本身和数据一般都存在内存中&#xff0c;当程序运行结束后&#xff0c;存放在内存中的数据被释放。如果需要长期保存程序运行所需的原始数据&#xff0c;或程序运行产生的结果&#xff0c;就需要把数据存储在文件或数据库。一般地&#x…

java 定时任务(三):cron表达式

From: https://www.cnblogs.com/sawyerlsy/p/7208321.html 一、完整的cron表达式由7位以空格分隔的时间元素组成&#xff0c;从左到右分别为&#xff1a;秒、分、时、日期、月份、星期几、年份。其中需要注意的有以下几点&#xff1a; 1. spring 4.x 的spring task中只支持前6种…

我为什么要立刻放弃 React 而使用 Vue?

From: https://baijiahao.baidu.com/s?id1607323518011007619&wfrspider&forpc CSDN 发布时间&#xff1a;18-07-29 19:28 现在&#xff0c;Vue.js 在 Github 上得到的星星数已经超过了 React。这个框架的流行度在不断增长&#xff0c;由于它并没有像 Facebok&#…

本地同时修改2个版本

为什么80%的码农都做不了架构师&#xff1f;>>> 昨天讨论后我又想了想&#xff0c;你主要的需求是想在本地同时修改2个版本&#xff0c;用分支也可以做到&#xff0c;方法如下 上图是库的目录结构&#xff0c;比如Codes上做了个分支b1&#xff0c;想同时在本地编辑…

Linux C 内存管理

提到C语言&#xff0c;我们知道C语言和其他高级语言的最大的区别就是C语言是要操作内存的&#xff01; 我们需要知道——变量&#xff0c;其实是内存地址的一个抽像名字罢了。在静态编译的程序中&#xff0c;所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字…

CSDN并购博客园遐想

我要打“假想”&#xff0c;打成了“遐想”&#xff0c;不过确实这篇文章属于我个人YY出来的。主要晚上写博客&#xff0c;用live writer发布好多次都不成功&#xff0c;然后用浏览器访问博客园首页&#xff0c;出现了下面画面。估计很多人都很熟悉这个界面&#xff0c;因为阿里…