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()返回值相等。

 import java.util.*;

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

 class Person{
private String name;
private double height;
public Person(String name, double height){
this.name = name;
this.height = height;
} @Override
public String toString(){
return "他/她是:" + name + "身高是:" + height;
} @Override
public boolean equals(Object obj){
if(this == obj){
return true;
}
//判断关键属性是否相等
if(obj != null && obj.getClass() == Person.class){
Person p = (Person)obj;
return this.height = p.height && this.name.equals(p.name);
}
return false;
} @Override
public int hashCode(){
return name.hashCode() + 10*(int)height;
}
} public class TestHashMap{
public static void main(String[] args){
HashMap<Person,double> hs = new HashMap<>(); hs.put(new Person("James",180),77);
hs.put(new Person("Polo",171),76);
hs.put(new Person("James",180),77); System.out.println(hs);
}
}

 2、TreeMap对key的要求:

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

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

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

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

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

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

查看/遍历Map方法:

 遍历Map有以下三种方法:

  遍历所有键值对: entrySet()

  遍历所有key: keySet()

  遍历所有value: values()

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

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

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

 import java.util.*;

 class TestForMap {
public static void main(String[] args){
HashMap<String, String> hp = new HashMap<String, String>();
hp.put("username","hp");
hp.put("password","12345");
hp.put("email","hp@hp.com");
hp.put("UserID","358"); //keySet()方式使用for循环遍历Map
for(String key : hp.keySet()){
//循环遍历Map的key值
System.out.println(key);
//循环遍历Map中key对应的value值
//System.out.println(hp.get(key));
} Iterator<String> it = hp.keySet().iterator();
while(it.hasNext()){
//循环遍历Map的key值
//System.out.println(it.next());
//循环遍历Map中key对应的value值
System.out.println(hp.get(it.next()));
}
}
}

疯狂java笔记(七) - Java集合之Map的更多相关文章

  1. 转 Java笔记:Java内存模型

    Java笔记:Java内存模型 2014.04.09 | Comments 1. 基本概念 <深入理解Java内存模型>详细讲解了java的内存模型,这里对其中的一些基本概念做个简单的笔记 ...

  2. Java笔记:Java集合概述和Set集合

    本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组 ...

  3. java第七章集合框架

    如果想存储多个人物信息可以使用数组实现但是采用数组存以下明显缺陷: 数组长度不变不能适应元素变化情况,若存储大于20个英雄信息则长度不够,若只存储10个则造成内存空间浪费.可用.length获取数组中 ...

  4. Java(28)集合三Map

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15228436.html 博客主页:https://www.cnblogs.com/testero ...

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

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

  6. Java笔记:Java 流(Stream)、文件(File)和IO

    更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...

  7. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

  8. Java 学习笔记 两大集合框架Map和Collection

    两大框架图解 Collection接口 由第一张图,我们可以知道,Collection接口的子接口有三种,分别是List接口,Set接口和Queue接口 List接口 允许有重复的元素,元素按照添加的 ...

  9. Java基础学习笔记七 Java基础语法之继承和抽象类

    继承 继承的概念 在现实生活中,继承一般指的是子女继承父辈的财产.在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系. 例如公司中的研发部员工和维护部员工都属于员工, ...

随机推荐

  1. delphi 控件大全(确实很全)

    delphi 控件查询:http://www.torry.net/ http://www.jrsoftware.org Tb97 最有名的工具条(ToolBar)控件库,仿Office97,如TDoC ...

  2. Yahoo!网站性能最佳体验的34条黄金守则(转载)

    1.       尽量减少HTTP请求次数  终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通过减少页面中的元素可以减少HTTP请求的次数 ...

  3. swift选择类或结构体

    按照通用的准则,当符合一条或多条以下条件时,请考虑构建结构体: 结构体的主要目的是用来封装少量相关简单数据值. 有理由预计一个结构体实例在赋值或传递时,封装的数据将会被拷贝而不是被引用. ? 任何在结 ...

  4. August 30th 2016 Week 36th Tuesday

    If you keep on believing, the dreams that you wish will come true. 如果你坚定信念,就能梦想成真. I always believe ...

  5. NYOJ题目839合并

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAKgCAIAAADmrHcoAAAgAElEQVR4nO3dO1LsOheG4X8S5AyE2A

  6. 20145206《Java程序设计》实验二Java面向对象程序设计实验报告

    20145206<Java程序设计>实验二Java面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O. ...

  7. HTTPCLIENT 学习 (1) 入门

    早就如雷贯耳它的大名,却一直不曾相见,昨天下载下来,今天终于测试了一把,用的官网的QUICK START例子,来访问我自己以前开发过的WEB程序,因为这个网站恰好有一个写好的通过POST请求验证用户名 ...

  8. 物化视图刷新慢--有可能是mv log被多个mv使用造成的

    同事说物化视图刷新慢,经检生产环境,发现部分物化视图刷新慢的原因是:由于同一个物化视图日志(mv log)被多个物化视图(mv)使用,不同的物化视图(mv)使用不同的刷新间隔,导致物化视图日志(mv ...

  9. Mac系统修改Intellij Idea默认JDK版本

    Intellij IDEA 默认情况下,使用的jdk的版本是1.6,当第一次启动IDEA的时候,如果系统中未安装jdk,则系统会自动到苹果官网下载jdk安装文件.如果你的系统已经安装了jdk1.7或是 ...

  10. 硬盘格式是MBR、GPT

    装win7 64位要求硬盘格式是MBR 现在预装 Win8 的电脑大多是采用新版 UEFI 固件 + GPT 格式磁盘 GPT模式是针对整个硬盘的初始化而言,因此不存在某一个分区是GPT模式的说法.转 ...