疯狂java笔记(七) - Java集合之Map
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相关推荐
- Java进阶,Set集合,Map集合
Java进阶,Set集合,Map集合 一.Set系列集合 1.Set系列集系概述 Set系列集合特点 无序:存取顺序不一致 不重复:可以去除重复 无索引:没有带索引的方法,所以不能使用普通for循环遍 ...
- java进阶开发-----Set集合、Map集合(接java集合)
(一).Set系列集合 Set系列集合特点 无序:存取顺序不一致 不重复:可以去除重复 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素. Set集合实现类特点 Ha ...
- 【Java基础】-【集合:Map接口 】
一.Map接口 1.Map接口概述 将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. 2.Map接口和Collection接口的不同 ①Map是双列的,Collection是 ...
- 【java笔记】Collections集合工具类
java.utils.Collections是集合工具类,用来对集合进行操作 常用方法: public static<T>boolean addAll(Collection<T> ...
- 【java笔记】有序集合SortedSet和有序映射SortedMap的使用
首先要明确的一点是java中原生的Set和Map是不具备排序能力的,即在遍历时是无顺序的.而 SortedSet和SortedMap接口提供了Set和Map的排序功能. 注意两者是接口. 1. Sor ...
- Java笔记:Java SE —— 核心类库(下)
数据来源:拉勾教育Java就业急训营 核心类库(下) 一. 异常机制和File类 1. 异常机制(重点) 1.1 概念 1.2 异常的分类 1.3 异常的避免 1.4 异常的捕获 笔试考点 1.5 异 ...
- 学java怎么做笔记?如何整理java笔记?java学习笔记
许多开始学Java编程的朋友,都是跟着视频学习的,知道要记笔记,但又不知如何下手.其实笔记主要的还是记框架以及自己能感觉到不懂得地方方便巩固加深印象,笔记不要记得密密麻麻的看着就让人感觉头疼,学习编程 ...
- java 笔记(4) —— java I/O 流、字节流、字符流
Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...
- 【狂神Java笔记】Java网络编程实战详细笔记整理(附代码)
1.1 概述 计算机网络: 计算机网络是指将地理位置不同 的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递 ...
最新文章
- 逻辑漏洞-找回密码修改返回包
- springboot项目中日志分类
- vs2017 cmake android,CMake构建VS2017工程
- cx_Oracle模块
- 什么是Git?——Git的学习与使用(一)
- BSD/MIT/Apache许可证印象尚可
- Spring AOP(七)之定义切入点
- 6.TCP/IP 详解卷1 --- ICMP:Internet 控制报文协议
- 简单举例JAVA回调函数的实现
- 面向对象需求分析方法实践
- 基于ansys命令流的水池静力学分析
- 数学基础知识02——常用积分公式
- centos7镜像文件
- Windows7 SP1旗舰版精简版最终版本
- SQL查询左连接、右连接、内连接
- 采访了 10 位身价过亿的 CEO,我终于看懂了有钱人的“奋斗”
- 这个世界不会因为你有多惨,就一下子对你有多好
- 06年你看过《武林外传》吗?如果看过,就明白什么叫物是人非
- 搭配安卓手机领夹式麦克风的PD快充方案来了LDR6023C 分享给大家
- 求球体的表面积,体积公式