在java.util中还增加了映射(Map)。映射是一个存储关键字和值的关联,或者说是“关键字/值”对的对象,即给定一个关键字,可以得到它的值。关键字和值都是对象,关键字必须是唯一的,但是可以存在相同的值。有的映射可以接收null关键字和null值,有的则不能。

可以将Map视为偶对象保存接口。Collection每一次只保存一个对象,而Map保存的是一对对象,而且这一对对象一定是按照“Key = Value”的形式保存,也就是说,可以通过Key找到对应的Value,那么这就好比使用电话本一样: ⑴ Key = 张三,Value = 110; ⑵ Key = 李四,Value = 120; 如果说现在要想找到张三的电话,那么首先应该通过张三这个Key,然后找到其对应的Value——110,如果现在保存的数据之中没有对应的Key,那么就返回null。

下表给出了支持映射的接口:

一、Map 接口

Map接口映射唯一关键字到值。关键字(key)是以后用于检索值的对象。给定一个关键字和一个值,可以存储这个值到一个Map对象中。当这个值被存储以后,就可以使用它的关键字来检索它。

Map的方法总结在下表中:

注意事项

(1)当调用的映射中没有项存在时,其中的几种方法会引发一个NoSuchElementException异常。 (2)当对象与映射中的元素不兼容时,则会引发一个ClassCastException异常。 (3)如果试图使用映射不允许使用的null对象,则会引发一个NullPointerException异常。 (4)当试图改变一个不允许修改的映射时,则会引发一个UnsupportedOperationException异常。

映射不是类集,但可以获得映射的类集“视图”。为了实现这种功能,可以使用entrySet( )方法,它返回一个包含了映射中元素的集合(Set)。为了得到关键字的类集“视图”,可以使用keySet( )方法。为了得到值的类集“视图”,可以使用values()方法。类集“视图”是将映射集成到类集框架内的手段。

二、SortedMap 接口

SortedMap接口扩展了Map,它确保了各项按关键字升序排序。

由SortedMap说明的方法总结在下表中:

注意事项

(1)当调用映射中没有的项时,其中的几种方法将引发一个NoSuchElementException异常。 (2)当对象与映射中的元素不兼容时,则会引发一个ClassCastException异常。 (3)当试图使用映射不允许使用的null对象时,则会引发一个nullPointerException异常。

三、Map.Entry 接口

Map.Entry接口使得可以操作映射的输入。

如由Map接口说明的entrySet( )方法,调用该方法可返回一个包含映射输入的集合(Set),这些集合元素的每一个都是一个Map.Entry对象。

下表总结了由该接口说明的方法:

四、映射类

AbstractMap对3个具体的映射实现来说,是一个超类。AbstractMap的另一个子类——WeakHashMap实现一个使用“弱关键字”的映射,它允许映射中的元素,当该映射的关键字不再被使用时,被放入回收站。

1、HashMap 类

HashMap类使用散列表实现Map接口,它是Map接口中最为常用的子类。

HashMap允许一些基本操作,如get( )和put( )的运行时间保持恒定,即便对大型的集合也是这样的。下面的构造方法定义为:

(1)HashMap( ) :构造一个默认的散列映射。 (2)HashMap(Map m) :用m的元素初始化散列映射。 (3)HashMap(int capacity) :将散列映射的容量初始化为capacity。 (4)HashMap(int capacity, float fillRatio) :用它的参数同时初始化散列映射的容量和填充比。

填充比(也称为加载容量)  填充比必须介于0.0与1.0之间,它决定在散列集合向上调整大小之前,有多少空间被充满。具体来说,就是当元素的个数大于散列集合容量乘以它的填充比时,散列集合将被扩大。对于没有获得填充比的构造方法,默认为0.75。

HashMap实现Map并扩展AbstractMap。 它本身并没有增加任何新的方法。应该注意的是:散列映射并不保证它的元素的顺序。 因此,元素加入散列映射的顺序并不一定是它们被迭代方法读出的顺序。

package com.xy.test3;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import java.util.Map.Entry;

public class HashMapDemo1 {

public static void main(String[] args) {

// 创建HashMap对象

HashMap hm = new HashMap();

// 加入元素到HashMap中

hm.put("John Doe", new Double(3434.34));

hm.put("Tom Smith", new Double(123.22));

hm.put("Jane Baker", new Double(1378.00));

hm.put("Todd Hall", new Double(99.22));

hm.put("Ralph Smith", new Double(-19.08));

// 返回包含映射中项的集合

Set> set = hm.entrySet();

// 用Iterator得到HashMap中的内容

Iterator> itr = set.iterator();

// 显示元素

while(itr.hasNext()) {

// Map.Entry可以操作映射的输入

/* 如果用Map来取值,其过程是先从Map中取得关键字之后,

* 再返回到Map中取得相对的值

* 而用Map.Entry,可以一次性地得到所有Map中的信息

*/

Map.Entry me = (Map.Entry)itr.next();

System.out.println(me.getKey() + " : " + me.getValue());

}

System.out.println();

// 让John Doe中的值增加1000

double balance = (Double)hm.get("John Doe").doubleValue();

// 用新值替换掉旧值

hm.put("John Doe", new Double(balance + 1000));

System.out.println("John Doe现在的资金: " + hm.get("John Doe"));

}

}

【结果】

2、TreeMap 类

TreeMap类是基于红黑树(Red-Black tree)实现Map接口。TreeMap提供了按排序顺序存储关键字/值对的有效手段,同时允许快速检索。应该注意的是,不像散列映射,树映射保证它的元素按照关键字升序排序。

下面的TreeMap构造方法定义为:

(1)TreeMap( ) :构造一个空的树映射,该映射使用其关键字的自然顺序来排序。 (2)TreeMap(Comparator comp) :构造一个空的基于树的映射,该映射通过使用Comparator comp来排序。 (3)TreeMap(Map m) :用从m的输入初始化树映射,该映射使用关键字的自然顺序来排序。 (4)TreeMap(SortedMap sm) :用从sm的输入来初始化一个树映射,该映射将按与sm相同的顺序来排序。

TreeMap实现SortedMap并且扩展AbstractMap,而它本身并没有另外定义其他的方法。

package com.xy.map;

import java.util.Collection;

import java.util.Iterator;

import java.util.TreeMap;

public class TreeMapDemo1 {

public static void main(String[] args) {

// 创建TreeMap对象

TreeMap tm = new TreeMap();

// 加入元素到TreeMap中

tm.put(10000-2000, "小红");

tm.put(10000-1500, "小四");

tm.put(10000-2500, "小明");

tm.put(10000-5000, "小光");

Collection col = tm.values();

Iterator itr = col.iterator();

System.out.println("工资由低到高:");

while(itr.hasNext()) {

System.out.println(itr.next());

}

}

}

【结果】

3、比较方法

TreeSet和TreeMap都按排序顺序存储元素。然而,更为“个性化”的排序顺序则需使用特定的比较方法。

通常在默认的情况下,这些类通过使用被Java称之为“自然顺序”的顺序存储它们的元素,而这种顺序通常也是你所需要的(A在B的前面,1在2的前面,等等)。如果需要用不同的方法对元素进行排序,可以在构造集合或映射时,指定一个Comparator对象(详细请参见第七部分比较器)。这样做为开发者提供了一种精确控制如何将元素储存到排序类集和映射中的能力。

下面是一个说明定制的比较方法能力的例子。该例子实现compare( )方法以便它按照正常顺序的逆向进行操作。因此,它使得一个树集合按逆向的顺序进行存储。

package com.xy.compare;

import java.util.Comparator;

import java.util.Iterator;

import java.util.TreeSet;

class MyComp implements Comparator {

public int compare(Object obj1, Object obj2) {

String aStr, bStr;

aStr = (String)obj1;

bStr = (String)obj2;

return bStr.compareTo(aStr);    // 注意是bStr调用的,不是aStr

}

}

public class ComparatorDemo2 {

public static void main(String[] args) {

// 创建一个TreeSet对象

TreeSet ts = new TreeSet(new MyComp());

// 向TreeSet对象中加入内容

ts.add("C");

ts.add("A");

ts.add("B");

ts.add("E");

ts.add("F");

ts.add("D");

// 得到Iterator的实例化对象

Iterator itr = ts.iterator();

// 显示全部内容

while(itr.hasNext()) {

Object element = itr.next();

System.out.print(element + " ");

}

}

}

【结果】  仔细观察实现Comparator并覆写compare()方法的MyComp类(正如前面所解释的那样,覆写equals( )方法既不是必需的,也不是常用的)。 在compare( )方法内部,String方法compareTo( )比较两个字符串。然而由bStr而不是aStr调用compareTo( )方法,会导致比较的结果被逆向。

对应一个更实际的例子:下面是用TreeMap程序实现存储账目资产平衡表例子的程序。下面的程序按姓对账目进行排序。为了实现这种功能,程序使用了比较方法来比较每一个账目下姓的先后顺序,得到的映射是按姓进行排序的。

package com.xy.compare;

import java.util.Comparator;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

import java.util.TreeMap;

class Employee implements Comparator {

public int compare(Object obj1, Object obj2) {

int k;

String aStr, bStr;

aStr = (String)obj1;

bStr = (String)obj2;

k = aStr.compareTo(bStr);

if(k == 0) {    // 相等

return aStr.compareTo(bStr);

}

else

return k;

}

}

public class ComparatorDemo3 {

public static void main(String[] args) {

// 创建TreeMap对象

TreeMap tm = new TreeMap(new Employee());

// 加入元素到TreeMap中

tm.put("John Doe", new Double(3434.34));

tm.put("Tom Smith", new Double(123.22));

tm.put("Jane Baker", new Double(1378.00));

tm.put("Todd Hall", new Double(99.22));

tm.put("Ralph Smith", new Double(-19.08));

Set> set = tm.entrySet();

Iterator> itr = set.iterator();

while(itr.hasNext()) {

Map.Entry me = (Map.Entry)itr.next();

System.out.println(me.getKey() + " : " + me.getValue());

}

System.out.println();

// 让John Doe中的值增加1000

double balance = (Double)tm.get("John Doe").doubleValue();

// 用新值替换掉旧值

tm.put("John Doe", new Double(balance + 1000));

System.out.println("John Doe现在的资金: " + tm.get("John Doe"));

}

}

【结果】

4、Map集合的输出

在Iterator接口中,我们强调过,若想输出集合的元素,可直接使用Iterator,那么在之前所有的集合都是Collection接口的子类,并且在Collection接口之中也定义了iterator()方法。但可是Map接口中却没有定义iterator()方法,所以现在如果要使用Iterator接口进行Map接口输出的话,就必须首先清楚Collection和Map接口保存对象的形式上的区别。

(1)Collection中的每一个元素都是一个独立的对象; (2)Map中的每一个元素都是Key和Value“结伴而行”的组合对象——也就是所谓的“偶对象”。

下面可通过保存图观察形式上的区别:

Map.Entry是Map中定义的一个内部接口,而且这个接口是一个使用了static定义的外部接口,在这个接口之中定义了两个非常重要的方法。 (1)取得对应的Key的方法。public K getKey(); (2)取得对应的Value的方法。public V getValue();

那么清楚了Map.Entry的作用之后,下面就可以采用如下的步骤进行Map的Iterator输出了: (1)通过Map接口之中entrySet()方法将Map集合变为Set集合,Set之中的泛型类型为Map. Entry; (2)利用Set接口之中的iterator()方法取得Iterator接口对象,此时的泛型类型依然为Map.Entry; (3)利用Iterator迭代出每一个Map.Entry对象,再使用getKey()和getValue()方法取出内容。

package com.xy.map;

import java.util.Map;

import java.util.Set;

import java.util.HashMap;

import java.util.Iterator;

public class IteratorMapDemo1 {

public static void main(String[] args) {

Map map = new HashMap();

map.put(1, "小三");

map.put(2, "小四");

map.put(3, "小五");

Set> set = map.entrySet();

Iterator> itr = set.iterator();

while(itr.hasNext()) {

Map.Entry me = itr.next();

System.out.println(me.getKey() + " : " + me.getValue());

}

}

}

【结果】

java映射的概念_Java之路:映射(Map)相关推荐

  1. java中ajax概念_Java之AJAX概念和实现方式

    Java之AJAX概念和实现方式 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-12 1.概念: Asynchronous JavaScript An ...

  2. java映射的概念_Java 反射 概念理解

    文章来源:http://hollischuang.gitee.io/tobetopjavaer/#/basics/java-basic/reflection 反射 反射机制指的是程序在运行时能够获取自 ...

  3. java 提交的内存_Java使用内存映射实现大文件的上传

    在处理大文件时,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 来进行频繁的读写操作,都将导致进程因频繁读写外存而降低速度.如 ...

  4. java 封装的概念_java封装的概念

    继承.封装.多态.抽象是面向对象编程的四大基本概念,其中封装尤为重要,因为从我们学习JAVA开始,就基本上接触了封装,因为JAVA中的所有程序都是写在类中的,类也能当做一种封装. 在面向对象中封装是指 ...

  5. java 协议这个概念_java网络协议概念是什么?

    网络协议 对于需要从事网络编程的程序员来说,网络协议是一个需要深刻理解的概念.那么什么是网络协议呢? 网络协议是指对于网络中传输的数据格式的规定.对于网络编程初学者来说,没有必要深入了解TCP/IP协 ...

  6. java线程池概念_Java 线程池概念、原理、简单实现

    线程池的思想概述 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结東了,这样频繁创建线程就会大大降低系 ...

  7. java的程序概念_Java程序基本概念

    大家好,在这里跟大家讲解一下关于Java程序的基本概念应用. 以下本人的介绍包括有以下的几点: 一.标识符的定义 二.数据类型的划分 三.运算符的应用 四.分支结构.循环结构.循环控制语法的应用 五. ...

  8. java变量类型概念_java变量类型

    ps:在java基础的学习过程中,经常会碰到各种java概念,所以做一个总结. 局部变量与全局变量 java区分局部变量和全局变量 局部变量是作用域很小的变量,一般定义在方法中,存储在栈内存空间中. ...

  9. java多态的概念_java中多态是什么?概念详解

    对于java中的多态你是怎样理解的呢?很多人表示,自己对于多态的概念不是很清楚,那么下面就让我们一起来详细的了解一下吧. 1.什么是多态? 多态简单的来说就是一种事物的多种存在形态. 在面向对象语言当 ...

  10. java强制转换概念_Java的“泛型”特性,你以为自己会了?(万字长文)

    使用Java的小伙伴,对于Java的一些高级特性一定再熟悉不过了,例如集合.反射.泛型.注解等等,这些可以说我们在平时开发中是经常使用到的,尤其是集合,基本是只要写代码没有用不到的,今天我们先来谈谈泛 ...

最新文章

  1. 通过python建立一个web服务查看服务器上的文本、图片、视频等文件
  2. 用hql查询的数据排序每次都不一样
  3. R语言观察日志(part2)--preProcess函数
  4. asp.net core监控—引入Prometheus(四)
  5. vue复选框默认被选中_vue .js绑定checkbox并获取、改变选中状态的实例
  6. 在线平互动台活动启动《Discover How to Make the Computer Easier to Use with Windows Vista》...
  7. MongoDB,分组,聚合
  8. Mysql 远程自动化备份
  9. 程序人生:程序员做外包“前途“,“技术“,“经验“如何决策
  10. c语言程序设计报告链表,c语言程序设计报告链表实现学生信息管理.docx
  11. 在Excel中用vba编写的进销存管理系统
  12. 4.1 CMMI4级——CMMI4级简述
  13. SpringBoot接口接收json参数
  14. ADC学习(2)——频谱性能指标
  15. 抖音短视频在线下载无水印,
  16. orcale和mysql跨库查询_Oracle如何实现跨库查询
  17. 安卓手机投屏软件_适合智能电视手机投屏的软件
  18. curl php 模拟来源_php采用curl实现伪造IP来源的方法
  19. 解决OBS录屏模糊问题
  20. 【JavaScript】懒加载

热门文章

  1. 如何破解“仅三天可见”的朋友圈?
  2. postgis学习(二)之几何图形
  3. 微信小程序使用wxParse解析html代码
  4. php后台框架整理集锦
  5. 顶级知识管理工具Evernote的GTD应用详细指南
  6. opencv同态滤波
  7. 鸟哥的Linux私房菜-基础篇(第九章)
  8. MyBatis mysql 字符串拼接
  9. 软件开发模型、瀑布模型、V模型、原型模型、增量模型、螺旋模型、喷泉模型
  10. Spring-xsd文件-配置文件