java基础-Map
简介
Map是一种接口,实现类有 hashMap
SortedMap是继承自Map的接口,实现类为TreeMap,在内部会对Key进行排序

遍历Map
- 使用 - for each循环遍历- Map实例的- keySet()方法返回的- Set集合,它包含不重复的- key的集合:- import java.util.HashMap;
 import java.util.Map; public class Main {
 public static void main(String[] args) {
 Map<String, Integer> map = new HashMap<>();
 map.put("apple", 123);
 map.put("pear", 456);
 map.put("banana", 789);
 for (String key : map.keySet()) {
 Integer value = map.get(key);
 System.out.println(key + " = " + value);
 }
 }
 }
 
- 同时遍历 - key和- value可以使用- for each循环遍历- Map对象的- entrySet()集合,它包含每一个- key-value映射:- import java.util.HashMap;
 import java.util.Map; public class Main {
 public static void main(String[] args) {
 Map<String, Integer> map = new HashMap<>();
 map.put("apple", 123);
 map.put("pear", 456);
 map.put("banana", 789);
 for (Map.Entry<String, Integer> entry : map.entrySet()) {
 String key = entry.getKey();
 Integer value = entry.getValue();
 System.out.println(key + " = " + value);
 }
 }
 }
 
遍历Map时,不可假设输出的key是有序的!
TreeMap
TreeMap不使用equals()和hashCode(),不用对这两个方法进行覆写
TreeMap的key要求
使用TreeMap时,放入的Key必须实现Comparable接口。
String、Integer这些类已经实现了Comparable接口,因此可以直接作为Key使用。作为Value的对象则没有任何要求。
如果作为Key的class没有实现Comparable接口,那么,必须在创建TreeMap时同时指定一个自定义排序算法:
TreeMap在比较两个Key是否相等时,依赖Key的
- compareTo()方法(key这个类需要实现Comparable接口,覆写compareTo方法)参考 或者
- Comparator.compare()方法。
将自定义的class作为key
例1:创建的时候传入 Comparator.compare()方法:
注意到Comparator接口要求实现一个比较方法,它负责比较传入的两个元素a和b,
- 如果a<b,则返回负数,通常是-1, 
- 如果a==b,则返回0, 
- 如果a>b,则返回正数,通常是1。 - TreeMap内部根据比较结果对Key进行排序。
例3:在key这个类里面实现Comparable接口,覆写compareTo方法
import java.util.*;
public class Test {
    public static void main(String[] args) {
        Map<Student, Integer> map = new TreeMap<>();
        map.put(new Student("Tom", 77), 1);
        map.put(new Student("Bob", 66), 2);
        map.put(new Student("Lily", 99), 3);
        for (Student key : map.keySet()) {
            System.out.println(key);
        }
        System.out.println(map.get(new Student("Bob", 66))); // null?
    }
}
class Student implements Comparable<Student> {
    public String name;
    public int score;
    Student(String name, int score) {
        this.name = name;
        this.score = score;
    }
    @Override
    public int compareTo(Student o) {
    	Student p = (Student) o;
    	if (this.score == p.score) {
            return 0;
        }
		return this.score < p.score ? -1 : 1;
    }
    public String toString() {
        return String.format("{%s: score=%d}", name, score);
    }
}
小结
- SortedMap在遍历时严格按照Key的顺序遍历,最常用的实现类是- TreeMap;
- 作为SortedMap的Key必须实现Comparable接口,或者传入Comparator;
- 要严格按照compare()规范实现比较逻辑,否则,TreeMap将不能正常工作。
java基础-Map的更多相关文章
- java基础-Map集合
		java基础-Map集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Map集合概述 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它 ... 
- Java  基础 Map 练习题
		第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ... 
- java基础-Map的静态初始化以及Map的遍历等.....................
		1.map的静态初始化,以及map遍历的几种方法: package com.cy.test; import java.util.HashMap; import java.util.Iterator; ... 
- UVA 814 The Letter Carrier's Rounds(JAVA基础map)
		题解:就是按照题目模拟就好 但是这个题目让我发现了我Java里面许多问题 具体看代码,但是还是分为这几个方面 属性的作用域问题,缓冲区问题,map与list映射的问题,输出多个空格不一定是/t,反转思 ... 
- java基础——Map集合
		Map以键值对的形式存储数据,其中Map.entry,是Map的内部类,它用来描述Map中的键值对.Map是一个接口,HashMap是他的一个实现类 Map中有几个重要的方法: get(Object ... 
- Java基础 - Map接口的实现类 : HashedMap / LinkedHashMap  /TreeMap 的构造/修改/遍历/ 集合视图方法/双向迭代输出
		Map笔记: import java.util.*; /**一:Collection接口的 * Map接口: HashMap(主要实现类) : HashedMap / LinkedHashMap /T ... 
- Java基础Map接口+Collections工具类
		1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ... 
- Java基础Map接口+Collections
		1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ... 
- JAVA基础第五章-集合框架Map篇
		业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ... 
随机推荐
- Python scan查找Redis集群中的key
			import redis import sys from rediscluster import StrictRedisCluster #host = "172.17.155.118&quo ... 
- linux记录每次登陆的历史命令
			编辑/etc/profile,增加如下代码 #Record history operation USER_IP=`>/dev/null |awk '{print $NF}' |sed -e 's ... 
- AI超越人类大脑,或许是场“别有用心者”的骗局
			 谷歌.微软.苹果.特斯拉.百度.腾讯.阿里等互联网巨头企业,以及纳德拉.马斯克.扎克伯格.马云等互联网大佬,近年来一直都对人工智能--AI非常上心.在众多场合对AI给予了或肯定,或恐惧的评价.但无 ... 
- fastcgi_param详解
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;#脚本文件请求的路径 fastcgi_param QUERY_STRI ... 
- 关于运算符的那些坑—自增x++&&++y
			题目 比较常见的问题,因为比较细,看书的时候一不注意可能就过去啦,但是遇到的时候就会容易出问题.先看下面程序,考虑一下运行结果是什么呢? int x = 1, y = 1; if(x++ == 2 & ... 
- 2020年JAVA大厂笔经面经
			个人简介  Java后台开发方向. 非计算机专业硕士,专业涉及到一些开发. 实验室项目主要是Java Web系统,挖掘小亮点. 无实习经验. 闲话唠嗑  回顾这几个月,宛若梦一场. 一开始心态不好 ... 
- JavaScript中prompt的使用
			*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.js * 作者:常轩 * 微信公众号:Worldhel ... 
- git指令-删除
			git指令-删除 添加一个新文件test.txt到Git并且提交: $ git add test.txt $ git commit -m "add test.txt" [maste ... 
- vue路由传参页面刷新参数丢失问题解决方案
			最近项目中涉及到跨页面传参数和后台进行数据交互,看到需求之后第一反应就是用路由传参来解决:Vue中给我们提供了三种路由传参方式,下面我们一个一个的来看一下: 方法一:params传参: this.$r ... 
- Asp.Net Core Endpoint 终结点路由之中间件应用
			一.概述 这篇文章主要分享Endpoint 终结点路由的中间件的应用场景及实践案例,不讲述其工作原理,如果需要了解工作原理的同学, 可以点击查看以下两篇解读文章: Asp.Net Core EndPo ... 
