Map是以键值对(key-value)的形式来存储数据的。而且Map不允许key的重复,通过Map存储key-value对时,只需要考虑key的存储就可以,key存储后value就会跟着key(完全可以把value当前key的"附庸舞")。

注意:如果只管Map里边的key,并把所有的key都手机起来那就变成set了。Map与set是一一对应的。

 1、Hashset底层是靠HashMap来实现的,HashMap用"hash"算法控制"一个萝卜一个坑"来进行快速存储;

 2、TreeSet底层是靠TreeMap来实现的,TreeMap就是真正的"红黑树";

 3、Hashtable线程是安全的(实现不好,性能低),HashMap是线程不安全的(但可以通过collections工具类来提升安全),HashMap性能要好些,除此之外Hashtable与HashMap几乎一样。

Map对key是有要求的:

 1、HashMap对key的要求:

  HashMap是根据key的hashCode()方法的返回值来计算key的存、取位置。

  那HashMap怎样才算两个key重复呢?

   ①、通过eqauls()方法比较返回true;

   ②、两个key的hashCode()返回值相等。

 1 import java.util.*;
 2
 3 public class HashMapTest{
 4     public static void main(String[] args){
 5         //HashMap只考虑key的存储,它对key的存储机制,几乎与HashSet的机制相同,add每放一次都仅一个值,put可放key-value对
 6         //如果希望HashMap记住我们添加元素的顺序,应该考虑使用LinkedHashMap
 7         HashMap<String,double> test = new HashMap<>();
 8
 9         //对于Map而言,每次添加都要key-value对
10         test.put("语文",88.0);
11         test.put("数学",99.0);
12         test.put("英语",78.0);
13
14         System.out.println(test.size());
15         System.out.println(test);
16     }
17 }

 1 import java.util.*;
 2
 3 class Person{
 4     private String name;
 5     private double height;
 6     public Person(String name, double height){
 7         this.name = name;
 8         this.height = height;
 9     }
10
11     @Override
12     public String toString(){
13         return "他/她是:" + name + "身高是:" + height;
14     }
15
16     @Override
17     public boolean equals(Object obj){
18         if(this == obj){
19             return true;
20         }
21         //判断关键属性是否相等
22         if(obj != null && obj.getClass() == Person.class){
23             Person p = (Person)obj;
24             return this.height = p.height && this.name.equals(p.name);
25         }
26         return false;
27     }
28
29     @Override
30     public int hashCode(){
31         return name.hashCode() + 10*(int)height;
32     }
33 }
34
35 public class TestHashMap{
36     public static void main(String[] args){
37         HashMap<Person,double> hs = new HashMap<>();
38
39         hs.put(new Person("James",180),77);
40         hs.put(new Person("Polo",171),76);
41         hs.put(new Person("James",180),77);
42
43         System.out.println(hs);
44     }
45 }

 2、TreeMap对key的要求:

  TreeMap底层的红黑树只对key进行排序,并且要求key必须是可比较大小的。TreeMap和TreeSet一样同样有两 种排序方法:

   ①、自然排序:要求所有key实现Comparable接口/(自定义的必须手动实现、默认已实现(API)的直接调用即可);

   ②、定制排序:要求创建TreeMap时提供一个Comparator对象

   那TreeMap怎样才算两个key重复呢?

    通过Compare()方法比较大小返回0时,则表明两个元素是相等的。

 1 public class TreeMapTest{
 2     public static void main(String[] args){
 3         //如果创建TreeMap时没有传入Comparator对象,说明用的是自然排序
 4         //因为String已经实现了Comparable接口
 5         TreeMap<String , Double> test = new TreeMap<>();
 6
 7         //对于Map而言,每次添加都要key-value对
 8         test.put("aaa",88.0);
 9         test.put("abc",99.0);
10         test.put("xyz",78.0);
11
12         System.out.println(test);
13     }
14 }

查看/遍历Map方法:

 遍历Map有以下三种方法:

  遍历所有键值对: entrySet()

  遍历所有key: keySet()

  遍历所有value: values()

JDK1.7后基本都是用第二种方法进行遍历,因为第二种方法性能是最好的,下面链接文章进行了详细比较:

http://www.cnblogs.com/fczjuever/archive/2013/04/07/3005997.html

 set和Map遍历的情况是一样的:都可以用for循环和迭代器进行遍历。

 1 import java.util.*;
 2
 3 class TestForMap {
 4     public static void main(String[] args){
 5         HashMap<String, String> hp = new HashMap<String, String>();
 6         hp.put("username","hp");
 7         hp.put("password","12345");
 8         hp.put("email","hp@hp.com");
 9         hp.put("UserID","358");
10
11         //keySet()方式使用for循环遍历Map
12         for(String key : hp.keySet()){
13             //循环遍历Map的key值
14             System.out.println(key);
15             //循环遍历Map中key对应的value值
16             //System.out.println(hp.get(key));
17         }
18
19         Iterator<String> it = hp.keySet().iterator();
20         while(it.hasNext()){
21             //循环遍历Map的key值
22             //System.out.println(it.next());
23             //循环遍历Map中key对应的value值
24             System.out.println(hp.get(it.next()));
25         }
26     }
27 }

疯狂java笔记(七) - Java集合之Map相关推荐

  1. Java进阶,Set集合,Map集合

    Java进阶,Set集合,Map集合 一.Set系列集合 1.Set系列集系概述 Set系列集合特点 无序:存取顺序不一致 不重复:可以去除重复 无索引:没有带索引的方法,所以不能使用普通for循环遍 ...

  2. java进阶开发-----Set集合、Map集合(接java集合)

    (一).Set系列集合 Set系列集合特点 无序:存取顺序不一致 不重复:可以去除重复 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素. Set集合实现类特点 Ha ...

  3. 【Java基础】-【集合:Map接口 】

    一.Map接口 1.Map接口概述 将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. 2.Map接口和Collection接口的不同 ①Map是双列的,Collection是 ...

  4. 【java笔记】Collections集合工具类

    java.utils.Collections是集合工具类,用来对集合进行操作 常用方法: public static<T>boolean addAll(Collection<T> ...

  5. 【java笔记】有序集合SortedSet和有序映射SortedMap的使用

    首先要明确的一点是java中原生的Set和Map是不具备排序能力的,即在遍历时是无顺序的.而 SortedSet和SortedMap接口提供了Set和Map的排序功能. 注意两者是接口. 1. Sor ...

  6. Java笔记:Java SE —— 核心类库(下)

    数据来源:拉勾教育Java就业急训营 核心类库(下) 一. 异常机制和File类 1. 异常机制(重点) 1.1 概念 1.2 异常的分类 1.3 异常的避免 1.4 异常的捕获 笔试考点 1.5 异 ...

  7. 学java怎么做笔记?如何整理java笔记?java学习笔记

    许多开始学Java编程的朋友,都是跟着视频学习的,知道要记笔记,但又不知如何下手.其实笔记主要的还是记框架以及自己能感觉到不懂得地方方便巩固加深印象,笔记不要记得密密麻麻的看着就让人感觉头疼,学习编程 ...

  8. java 笔记(4) —— java I/O 流、字节流、字符流

    Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...

  9. 【狂神Java笔记】Java网络编程实战详细笔记整理(附代码)

    1.1 概述 计算机网络: 计算机网络是指将地理位置不同 的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递 ...

最新文章

  1. c语言一行黑白相间的瓷砖,C语言编程练习15:贴瓷砖
  2. SecureCRT设置和Xshell一样的快速命令集(使用快捷键输入命令和密码)
  3. Flash 插件又被曝出新漏洞,让攻击者可以控制 Mac
  4. 随笔小杂记(六)——tqdm进度条显示出现多余行
  5. 数据库大作业-学生宿舍管理系统
  6. exosip2协议栈原理分析以及总结
  7. java 修改Chrome浏览器的默认下载路径
  8. Ceph分布式存储系列(六):对象存储、块存储、文件存储的区别和优缺点
  9. 网络安全学习--002--windows基础知识
  10. 在OEL6.5平台安装Oracle11g 数据库
  11. 兼容IE8的文件下载,解决IE下载文本和图片直接打开问题
  12. 【音乐系列】吉他学习入门基本知识
  13. Mac 下配置使用windows局域网共享打印机
  14. 比较两组数据的差异用什么图更直观_用Excel制作旋风图
  15. qt tableWidget 去掉网格线
  16. 关于高电平与低电平的使用
  17. EXCEL操作视频集1-10
  18. Mind the Box: $\ell_1$-APGD for Sparse Adversarial Attacks on Image Classifiers
  19. 详解ArcGIS (Pro)面积制表(区域制表)参数设置及报错处理
  20. 什么是组合,作用是什么?

热门文章

  1. 魔兽世界自建服务器,魔兽世界怀旧服
  2. godot着色器shader效果收集
  3. [MetalKit]32-Shadows-in-Metal-part-2阴影2
  4. Android 实现短信接收监听--(短信动态权限添加)
  5. 【MOTRIX】使用motrix下载百度云文件
  6. mysql结果作为另一次查询_MySql中一次查询结果用作二次查询条件
  7. 海豚php完全开发手册,ThinkPHP2.1完全开发手册
  8. Win8 纯净版安装详细教程
  9. Windows系统win10系统磁力种子文件下载软件推荐
  10. 牛牛的闹钟--网易2019实习生招聘编程题