- 浏览: 521731 次
- 性别:
- 来自: 杭州
-
文章分类
- 全部博客 (114)
- C基础 (1)
- C指针 (0)
- C语言库函数相关 (1)
- Linux (2)
- Linux网络编程 (1)
- PostgreSQL (0)
- Redis (2)
- Java Web (2)
- JAVA基础 (35)
- Ubuntu (8)
- Android (2)
- MySQL (3)
- 日志 (1)
- 书虫 (1)
- 数据结构 (0)
- 算法 (0)
- 开发工具 (1)
- 转载 (13)
- 英语 (18)
- tomcat启动脚本分析 (3)
- Oracle基础 (4)
- tomcat源码分析 (3)
- tomcat (1)
- Java相关 (1)
- Oracle基本原理--Oracle体系结构 (0)
- Oracle基本原理--表 (0)
- Oracle基本原理--索引 (0)
- Oracle基本原理--事务 (0)
- Oracle开发--SQL (1)
- Oracle基本原理--PL/SQL (0)
- Oracle基本原理--常用函数 (0)
- Oralce管理--用户及权限管理 (0)
- Oracle管理--安装调试 (0)
- Oracle管理--备份恢复 (0)
- Oralce管理--数据迁移 (0)
- Oracle管理--闪回 (0)
- Oracle管理--故障处理 (0)
- Oracle优化原理--统计信息 (0)
- Oracle优化原理--执行计划 (0)
- Oracle优化原理--诊断工具 (0)
- Oracle优化原理--深入理解表 (0)
- Oracle优化原理--深入理解索引 (0)
- Oracle优化原理--表连接原理 (0)
- Java--OOP (0)
- Java--异常 (0)
- Java--泛型 (0)
- Java--集合 (0)
- Java--IO (0)
- Java--枚举类型 (0)
- Java--注释 (0)
- Java--多线程 (0)
- Java--XML (0)
- Java--JDBC (3)
- Servlet (0)
- JSP (0)
- JSTL (0)
- 设计模式 (0)
- DAO与MVC (0)
- Javascript (2)
- Ajax (0)
- JQuery (0)
- HTML/CSS (0)
- 前端相关 (1)
- HTTP (0)
- TCP/IP (0)
- GO基础 (0)
最新评论
-
jsonmong:
推荐一个开发平台,采用的是插件化的设计思想,效果很不错的。ht ...
构建Java Web开发环境 -
wxm198427:
首先表示辛苦了!我想问个问题:我的是windows 7 x64 ...
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 -
握着橄榄枝的人:
我之前按照你的update mysql.user set pa ...
Windows7下MySQL5.5.20免安装版的配置 -
confident_f:
安装了32的客户端后,用plsql导入导出表有问题,生成不了d ...
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 -
confident_f:
安装数据库的时候第9步卡住了 是怎么回事呢?
Oracle 11g R2 for Win7旗舰版(64位)的安装步骤
5、Map集合
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
程序的运行结果如下:
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
源文件:Person.java
源文件:TestMap.java
程序的运行结果如下:
该键对象不存在!
无论执行多少次,输出的信息都为“该键对象不存在!”,即在集合中不存在该键对象。这是因为没有重写java.lang.Object()类中的hashCode()和equals()方法,equals()方法默认比较两个对象的地址,因此即使这两个键对象的内容完全相同,也不认为是同一个对象,重写后的hashCode()和equals()方法的完整代码如下:
重写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
源文件:TestMap.java
程序的运行结果如下:
由HashMap类实现的Map集合,无序:
22016 马先生
22018 李小姐
22015 马先生
由TreeMap类实现的Map集合,键对象升序:
22015 马先生
22016 马先生
22018 李小姐
由TreeMap类实现的Map集合,键对象降序:
22018 李小姐
22016 马先生
22015 马先生
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 马先生
发表评论
-
foreach循环
2013-06-24 16:15 1495从JDK1.5开始,Java提供了一个更简单的循环:forea ... -
可变参数
2013-06-24 15:38 1224从JDK1.5开始,Java允许使用可变参数为方法指定数量不确 ... -
泛型(core java 笔记)
2013-06-18 16:18 20741.为什么引入泛型 package generic; ... -
两个程序的说明
2010-10-19 09:26 11661、程序1的结果是: clas ... -
构造器初始化
2010-10-18 14:42 1535可以用构造器来进行初始化。在运行时刻,可以调用方法或执行某些动 ... -
成员初始化
2010-10-18 07:55 1247Java尽力保证:所有变量在使用前都能得到恰当的初始化。 对 ... -
线程的死锁
2010-10-11 19:21 1523当两个线程相互等待对方释放同步监视器时就会发生死锁,Java虚 ... -
线程的同步
2010-10-11 19:00 1290一个经典的关于线程安全性的问题:银行取钱问题。 银行取钱的基 ... -
java网站收集
2010-10-10 18:13 1294JAVA开发者最常去的25个英文网站:http://www.i ... -
控制线程
2010-10-10 16:06 20261、线程睡眠:sleep 如果我们需要让当前正在执行的线程暂 ... -
线程的状态
2010-09-28 19:00 1076线程从创建到执行完毕的整个过程称为线程的生命周期,在整个生命周 ... -
Java中Thread类的start()和run()的区别
2010-09-27 15:33 41371、start()方法来启动线程,真正实现了多线程运行,这时无 ... -
Java中创建线程的两种方法
2010-09-26 10:18 5646在Java中创建线程有两种方法:继承Thread类和实现Run ... -
创建String对象过程的内存分配小结
2010-09-23 20:32 2794常量池(Constant Pool):指的是在编译期被确定,并 ... -
Java堆和栈的区别 经典总结(转载)
2010-09-18 16:48 1289栈与堆都是Java用来在Ram中存放数据的地方。 与C++不 ... -
Java初学者都必须理解的七大问题
2010-09-18 10:36 1131问题一:我声明了什么 ... -
关于计算java程序运行时间(转载)
2010-09-18 09:22 1136//第一种,伪代码 long startTime= ... -
for循环的优化
2010-09-17 20:29 2158在程序中经常用到for循环,当一些算法实时性要求非常高时,对f ... -
详细解析Java中抽象类和接口的区别(转载)
2010-09-17 10:16 1126在Java语言中,abstract class和inter ... -
集合类(三):Set集合
2010-09-16 19:43 29264、Set集合 Set集合为集类型,集是最简单的一种集合,存放 ...
相关推荐
【Java Map 集合类简介】 在Java的`java.util`包中,集合类扮演着重要的角色,其中List和Map是最为常见的两种。List的实现例如ArrayList和Vector,它们都是可变大小的列表,适合存储和操作各种类型对象的序列。特别...
重点探讨了 Java集合框架中的 Map接口及其主要实现类(HashMap、TreeMap、LinkedHashMap),并通过示例代码展示它们的使用方法。文章还深入讨论了泛型在 Map中的应用及其优缺点,最后介绍了一些高级用法,如自定义 ...
最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象元素列表。 List 适用于按数值索引访问元素的情形。 Map 提供了一个更...
四、如何选择集合类 在选择集合类时,需要考虑到存储数据的特点和需求。如果需要存储大量数据,可以选择 ArrayList 或 LinkedList。如果需要存储键值对的数据,可以选择 HashMap 或 TreeMap。如果需要存储唯一的...
Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、...
#### 四、Map集合的常用方法 - **添加** - `V put(K key, V value)`: 向Map中添加一个键值对。如果键已存在,则替换原有的值,并返回旧值;如果键不存在,则添加新键值对并返回`null`。 - **删除** - `void clear...
同时,文章深入探讨了各种集合类的底层数据结构,包括List、Set、Map的实现细节,并讨论了如何确保集合的线程安全以及集合的快速失败机制。 适合人群:适用于初学者及有一定经验的Java开发者,尤其是那些需要深入...
Java集合排序及java集合类详解(Collection、List、Map、Set)讲解 Java集合框架是Java语言中最重要的组件之一,能够正确使用Java集合框架对于Java程序的开发具有无比的好处。本文将详细解释Java集合框架的实现原理、...
3. 集合类的实现:分析List类和Map类的内部结构,理解它们如何存储和操作数据。 4. 面向接口编程:虽然易语言没有像Java那样的接口概念,但可以通过模拟接口的实现,提供类似的功能。 5. 键值对操作:了解如何在Map...
在计算机编程中,尤其是Java语言,Map集合是一个重要的数据结构,用于存储键值对的数据。Map接口提供了多种实现,如HashMap、TreeMap等,每种实现都有其特定的特性和性能优势。遍历Map集合是常见的操作,可以用于...
自定义集合类则是开发者根据特定需求扩展Java集合框架的行为,以满足个性化或特定业务场景的功能需求。以下是对"java自定义集合类"这一主题的详细解释。 首先,Java集合框架包括接口(如List、Set、Map)和实现这些...
### Java集合排序及Java集合类详解 #### 一、集合框架概述 集合框架是Java编程语言的核心组件之一,用于组织和操作数据集。Java集合框架提供了多种数据结构,包括列表(List)、集(Set)和映射(Map),这些数据结构...
Java集合类是Java编程语言中一个非常重要的概念,它提供了数据结构和算法的实现,使得在处理一组对象时更加高效和灵活。Java集合框架包括接口(如List、Set、Queue等)和实现这些接口的类(如ArrayList、HashSet、...
这些集合类和接口的设计旨在满足不同的需求,并提供了高效的数据管理和操作手段。Java集合框架主要由四个关键部分组成:接口、实现、算法和辅助类。下面我们将详细探讨这些概念。 #### 主要接口 1. **Collection**...
Map集合中常用的实现类有HashMap、TreeMap、LinkedHashMap等,它们各自有不同的特性。 **2. HashMap** HashMap是Map接口的一个实现类,它允许null键和null值。HashMap基于哈希表实现,因此插入和查找的平均时间...
HashTable是早期的集合类,它是线程安全的,适合多线程环境,但不支持null键和值,且效率相对较低。而HashMap虽然不是线程安全的,但在单线程或已同步的环境中,其性能通常优于HashTable。 在选择使用哪种集合类时...
### Java集合类详解总结 在Java编程中,集合框架(Collection Framework)是处理一组对象的强大工具,它提供了标准的数据结构来存储和操作这些对象。Java集合框架主要包括`Collection`、`Set`、`List`、`Queue`、`...
### 读取Excel文件将数据存入Map集合 在日常工作中,经常需要处理Excel文件,尤其是在数据统计、分析等场景中。本篇文章介绍了一个方法,该方法能够读取Excel文件并将其中的数据存储到Java中的`Map`集合里,便于...
Java集合框架主要包括四种类型的集合:List、Set、Queue和Map。每种集合都有其独特的特性和应用场景。 - **List**:有序集合,支持元素重复。典型实现包括`ArrayList`和`LinkedList`。 - **Set**:无序集合,不支持...
java集合类list-set-map.doc