- 浏览: 27090 次
- 性别:
- 来自: 福州
最新评论
Map集合为映射类型,映射与集和列表有明显的区别,映射中的每个对象都是成对存在的。映射中存储的每个对象都有一个相应的键(Key)对象,在检索对象时必须通过相应的键对象来获取值(value)对象,类似于在字典中查找单词一样,因此要求键对象必须是惟一的。键对象还决定了存储对象在映射中的存储位置,但并不是键对象本身决定的,需要通过一种散列技术进行处理,从而产生一个被称作散列码的整数值,散列码通常用作一个偏置量,该偏置量是相对于分配给映射的内存区域的起始位置的,由此来确定存储对象在映射中的存储位置。理想情况下,通过散列技术得到的散列码应该是在给定范围内均匀分布的整数值,并且每个键对象都应该得到不同的散列码。
1. Map集合的用法
Map集合包括Map接口以及Map接口的所有实现类。由Map接口提供用来操作集合的常用方法如下表5所示:
Map接口的常用实现类有HashMap和TreeMap,HashMap类通过哈希码对其内部的映射关系进行快速查找,而TreeMap类中的映射关系存在一定的顺序,如果希望在遍历集合时是有序的,应该使用由TreeMap类实现的Map集合,否则建议使用由HashMap类实现的Map集合,因为由HashMap类实现的Map集合对于添加和删除映射关系更高效。
Map集合允许值对象为null,并且没有个数限制,因此当get()方法的返回值为null时,可能有两种情况,一种是在集合中没有该键对象,另一种是该键对象没有映射任何值对象,即值对象为null。因此,在Map集合中不应该利用get()方法来判断是否存在某个键,而应该利用containsKey()方法来判断。
例如:
源文件:TestMap.java
- import java.util.*;
- public class TestMap{
- public static void main(String args[]){
- Map<Integer,String> map = new HashMap<Integer,String>();
- System.out.println("map集合是否为空:"+map.isEmpty());
- map.put(22015,null);
- System.out.println("map集合是否为空:"+map.isEmpty());
- map.put(22016,"马先生");
- System.out.println("map集合是否为空:"+map.isEmpty());
- System.out.println("get()方法的返回结果:");
- System.out.print(map.get(22015));
- System.out.print(" "+map.get(22016));
- System.out.println(" "+map.get(22017));
- System.out.println("containsKey()方法的返回结果:");
- System.out.print(map.containsKey(22015));
- System.out.print(" "+map.containsKey(22016));
- System.out.println(" "+map.containsKey(22017));
- System.out.println("map集合中映射的个数:"+map.size());
- map.remove(22015);
- System.out.println("map集合中映射的个数:"+map.size());
- }
- }
程序的运行结果如下:
map集合是否为空:true
map集合是否为空:false
map集合是否为空:false
get()方法的返回结果:
null 马先生 null
containsKey()方法的返回结果:
true true false
map集合中映射的个数:2
map集合中映射的个数:1
2. 使用HashMap类
HashMap类实现了Map接口,由HashMap类实现的Map集合允许以null作为键对象,但是因为键对象不可以重复,所以这样的键对象只能有一个。如果经常需要添加、删除和定位映射关系,建议利用HashMap类实现Map集合,不过在遍历集合时得到的映射关系是无序的。
在使用由HashMap类实现的Map集合时,如果想有效地使用,就必须重写作为主键对象类的hashCode()方法,在重写hashCode()方法时,有两条基本原则:
● 不唯一原则:不必为每个对象生成一个惟一的哈希码,只要通过hashCode()方法生成的哈希码,利用get()方法能够得到利用put()方法添加的映射关系即可。
● 分散原则:生成哈希码的算法应尽量使哈希码的值分散一些,不要将很多哈希码值都集中在一个范围内,这样有利于提高由HashMap类实现的Map集合的性能。
例如:
源文件:PK_person.java
- public class PK_person{
- private String prefix;
- private long number;
- public String setPrefix(){
- return prefix;
- }
- public void setPrefix(String prefix){
- this.prefix = prefix;
- }
- public long getNumber(){
- return number;
- }
- public void setNumber(long number){
- this.number = number;
- }
- public String getPK(){
- return this.prefix+"_"+this.number;
- }
- public void setPK(String pk){
- int i = pk.indexOf("_");
- this.prefix = pk.substring(0,i);
- this.number = new Integer(pk.substring(i));
- }
- }
源文件:Person.java
- public class Person{
- private String name;
- private PK_person number;
- public Person(PK_person number,String name){
- this.number = number;
- this.name = name;
- }
- public String getName(){
- return name;
- }
- public void setName(String name){
- this.name = name;
- }
- public PK_person getNumber(){
- return number;
- }
- public void setNumber(PK_person number){
- this.number = number;
- }
- }
源文件:TestMap.java
- import java.util.*;
- public class TestMap{
- public static void main(String args[]){
- Map<PK_person,Person> map = new HashMap<PK_person,Person>();
- PK_person pk_person1 = new PK_person();
- pk_person1.setPrefix("MR");
- pk_person1.setNumber(22015);
- map.put(pk_person1,new Person(pk_person1,"马先生"));
- PK_person pk_person2 = new PK_person();
- pk_person2.setPrefix("MR");
- pk_person2.setNumber(22015);
- Person person = map.get(pk_person2);
- if(person == null){
- System.out.println("该键对象不存在!");
- }
- else{
- System.out.println(person.getNumber().getNumber()+" "+person.getName());
- }
- }
- }
程序的运行结果如下:
该键对象不存在!
无论执行多少次,输出的信息都为“该键对象不存在!”,即在集合中不存在该键对象。这是因为没有重写java.lang.Object()类中的hashCode()和equals()方法,equals()方法默认比较两个对象的地址,因此即使这两个键对象的内容完全相同,也不认为是同一个对象,重写后的hashCode()和equals()方法的完整代码如下:
- public int hashCode(){//重写hashCode()方法
- return (int)(number + prefix.hashCode());
- }
- public boolean equals(Object obj){//重写equals()方法
- if(obj == null){
- return false;
- }
- if(getClass()!=obj.getClass()){
- return false;
- }
- if(this == obj){
- return true;
- }
- final PK_person other = (PK_person)obj;
- if(this.hashCode()!=other.hashCode()){
- return false;
- }
- return true;
- }
重写PK_person类中的hashCode()和equals()方法后,再次执行程序,结果如下:
2015 马先生
3. 使用TreeMap类
TreeMap类不仅实现了Map接口,还实现了Map接口的子接口java.util.SortedMap。由TreeMap类实现的Map集合不允许键对象为null,因为集合中的映射关系是根据键对象按照一定顺序排列的,TreeMap类通过实现SortedMap接口得到的方法如下表6所示:
在添加、删除和定位映射关系上,TreeMap类要比HashMap类的性能差一些,但是其中的映射关系具有一定的顺序,如果不需要一个有序的集合,则建议使用HashMap类;如果需要进行有序的遍历输出,则建议使用TreeMap类,在这种情况下,可以先使用由HashMap类实现的Map集合,在需要顺序输出时,在利用现有的HashMap类的实例创建一个具有完全相同映射关系的TreeMap类型的实例。
例如:
源文件:Person.java
- public class Person{
- private String name;
- private long id_card;
- public Person(String name,long id_card){
- this.id_card = id_card;
- this.name = name;
- }
- public String getName(){
- return name;
- }
- public void setName(String name){
- this.name = name;
- }
- public long getId_card(){
- return id_card;
- }
- public void setId_card(long id_card){
- this.id_card = id_card;
- }
- }
源文件:TestMap.java
- import java.util.*;
- public class TestMap{
- public static void main(String args[]){
- Person p1 = new Person("马先生",22015);
- Person p2 = new Person("李小姐",22018);
- Person p3 = new Person("马先生",22016);
- Map<Number,Person> map = new HashMap<Number,Person>();
- map.put(22015,p1);
- map.put(22018,p2);
- map.put(22016,p3);
- System.out.println("由HashMap类实现的Map集合,无序:");
- Iterator<Number> it1 = map.keySet().iterator();
- while(it1.hasNext()){
- Person person = map.get(it1.next());
- System.out.println(person.getId_card()+" "+person.getName());
- }
- System.out.println("由TreeMap类实现的Map集合,键对象升序:");
- TreeMap<Number,Person> treeMap1 = new TreeMap<Number,Person>();
- treeMap1.putAll(map);
- Iterator<Number> it2 = treeMap1.keySet().iterator();
- while(it2.hasNext()){
- Person person = treeMap1.get(it2.next());
- System.out.println(person.getId_card()+" "+person.getName());
- }
- System.out.println("由TreeMap类实现的Map集合,键对象降序:");
- TreeMap<Number,Person> treeMap2 = new TreeMap<Number,Person>(Collections.reverseOrder());
- treeMap2.putAll(map);
- Iterator<Number> it3 = treeMap2.keySet().iterator();
- while(it3.hasNext()){
- Person person = treeMap2.get(it3.next());
- System.out.println(person.getId_card()+" "+person.getName());
- }
- }
- }
程序的运行结果如下:
由HashMap类实现的Map集合,无序:
22016 马先生
22018 李小姐
22015 马先生
由TreeMap类实现的Map集合,键对象升序:
22015 马先生
22016 马先生
22018 李小姐
由TreeMap类实现的Map集合,键对象降序:
22018 李小姐
22016 马先生
22015 马先生
发表评论
-
基础数据结构——图
2010-09-20 15:49 875图(Graph)G由两个 ... -
基础数据结构——树
2010-09-20 15:48 791树:T={K,R}。K是包含n个结点的有穷集合(n ... -
基础数据结构——栈和队列
2010-09-20 15:40 744所谓的栈,是一个含有至少两个基本操作的抽象数据类型 ... -
基本数据结构——数组和链表
2010-09-20 15:38 1179数组的这个可 ... -
集合框架——Set
2010-09-20 15:19 821Set集合为集类型,集是最简单的一种集合,存放于集 ... -
集合框架——List
2010-09-20 15:16 1142List集合为列表类型,列表的主要特征是存放其中的 ... -
集合框架——Collection
2010-09-20 15:12 665Collection接口是List接口和Set接口 ... -
Object
2010-09-20 12:09 786java.lang.Object类是所有Java类的最高层次 ... -
Java的7个基础问题
2010-09-20 12:08 545问题一:我声明了什么! Java代码 ... -
堆和栈的区别
2010-09-20 12:06 615栈与堆都是Java用来在Ram中存放数据的地方。 与C++不同 ... -
Comparable和Comparator
2010-09-20 09:22 506public interface Comparable&l ... -
如何使用异常的原则(转)
2010-09-17 15:00 443作者:Bill Venners著,chenkw 译 摘要 ... -
异常的捕获与抛出原则(转)
2010-09-17 14:58 686在可能会出现exception的 ... -
J2EE系统异常的处理准则(转)
2010-09-17 11:43 611J2EE系统异常的处理准则 ... -
J2EE项目的异常处理(转)
2010-09-17 11:18 523为什么要在J2EE项目中谈 ... -
集合框架——简介
2010-09-16 14:46 728一、初识: 集合类是 Java基础技术中十分 ... -
异常那点事
2010-09-16 14:05 603一、概述 在Java程序设计语言中,异常对象都是派生自jav ... -
内部类详解
2010-09-16 13:11 635内部类详解 1、定义 ... -
优化JVM参数提高eclipse运行速度(转)
2010-09-16 12:59 573性能优化从身边做起。 首先建立评估体系,将workspac ... -
四个有害的java编码习惯
2010-09-15 19:16 589John O'Hanley 的这篇文章列举了四个有害的java ...
相关推荐
这份资料不仅应该触及Java的基石——例如JVM的工作原理、内存模型、垃圾回收机制,以及Java的集合框架中的核心接口与实现类,如List、Set、Map等,更应对Java的异常处理机制有深入的剖析 此外,考虑到Java技术的...
第3章 当一个变成多个——集合框架的基本概念 53 .3.1 讲解 54 3.1.1 集合概述 54 3.1.2 Collection接口 54 3.1.3 泛型(Generics) 56 3.1.4 Map接口 57 3.2 练习 59 3.2.1 创建课程管理系统 59 3.3 小结 ...
第3章 当一个变成多个——集合框架的基本概念 53 .3.1 讲解 54 3.1.1 集合概述 54 3.1.2 Collection接口 54 3.1.3 泛型(Generics) 56 3.1.4 Map接口 57 3.2 练习 59 3.2.1 创建课程管理系统 59 3.3 小结 ...
第3章 当一个变成多个——集合框架的基本概念 53 .3.1 讲解 54 3.1.1 集合概述 54 3.1.2 Collection接口 54 3.1.3 泛型(Generics) 56 3.1.4 Map接口 57 3.2 练习 59 3.2.1 创建课程管理系统 59 3.3 小结 ...
出,Android真机开发教程,Android中文翻译组——Android中文API合集(4), bluetooth 蓝牙,Google_Map_API谷歌地 图,Android的XML解析,牛人Android提高篇,手把手教你用Android开发新浪微博客户端
出,Android真机开发教程,Android中文翻译组——Android中文API合集(4), bluetooth 蓝牙,Google_Map_API谷歌地 图,Android的XML解析,牛人Android提高篇,手把手教你用Android开发新浪微博客户端
2020世界信息安全大会演示PPT集合,共大家参考学习,包括: 基于OPC DA协议C2攻击链; 安全运营体系建设; 大型企业基础架构安全; 工控设备系统安全实践; 攻防技术趋势和企业威胁猎捕能力建设实践; 合规视角下...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
第14章 集合框架——强大的对象管理器 270 14.1 Object类——所有类的超类 270 14.1.1 toString方法的重写 270 14.1.2 equals方法的意义 271 14.1.3 hashCode方法的意义 272 14.2 重写equals与hashCode...
集合的四个基本操作,并解释何时使用每个操作。 预计长度 任务 分钟 操作说明 25-40 活动与挑战 25-45 结语 10 示例学生课程 —— —— 示例活动 (未完成) 示例牌组 没有可用的。 示例讲师课程计划 框架 到目前...
Android中文翻译组——Android中文API合集(4).pdf Android内存泄露调试.pdf android写的google map api 应用.zip Android实现GPS定位.pdf Android应用框架原理与程序设计36技.pdf Android摄像头的应用.pdf 还有很...
一个Map函数处理一个基于key/value pair的数据集合,输出中间的基于key/value pair的数据集合;然 后再创建一个Reduce函数用来合并所有的具有相同中间key值的中间value值。现实世界中有很多满足 上述处理模型的例子...
UMPAY——编码规范 日志规范 异常规范 网络 协议 TCP/IP HTTP hession file HTTPS 负载均衡 容器 JBOSS tomcat resin jetty 容灾 日志框架 开源框架 slf4j 框架实现 log4j logback commong ...
12 对Map排序 4. 13 Properties属性文件 第5章 字符串 5. 1 使用String 5. 2 基本数据类型与字符串的转化 5. 3 判断Java标识符 5. 4 使用StringBuffer 5. 5 IP地址转化成整数 5. 6...
3.3.5 处理集合 43 3.4 本章小结 44 3.5 习题 44 第Ⅱ部分 Python语言和标准库 第4章 做出决策 49 4.1 比较两个值是否相等 49 4.2 比较两个值是否不相等 51 4.3 比较两个值的大小 51 4.4 对真值和假值取反 53 4.5 ...
迭代器Iterator、生成器Generators、不定参数Rest、默认参数Default、解构Destructuring、生成器Generator、代理Proxy,以及几种新类型:Set、Map、WeakSet、WeakMap、集合Collection。 以上提及的新特性只是其中的...
取支持度阈值s =185,用A-Priori算法在Map-Reduce框架下提取其中的最大频繁项集Lk。 附件:某超市数据集basketdata.xls 二、实验设计(原理分析及流程) 该算法的基本思想是:首先找出所有的频集,这些项集出现的...
第3章 引擎的核心——渲染框架 49 3.1 基本框架 50 3.1.1 引擎的位置 50 3.1.2 根源种子 51 3.1.3 子类结构 57 3.2 渲染框架 57 3.2.1 框架结构 58 3.2.2 摄像机类(CCCamera) 59 3.2.3 导演类(CCDirector...