• Map

映射关系,也有人称为字典,Map集合里存在两组值,一组是key,一组是value。Map里的key不允许重复。通过key总能找到唯一的value与之对应。Map里的key集存储方式和对应的Set集合中的元素存储方式一致,Map.Entry是Map接口的内部接口,专门用来保存key-value内容:



Map 用于保存具有映射关系的数据,因此 Map 集合里保存着两组值,一组值用于保存 Map 里的 Key,另外一组用于保存 Map 里的 Value。Map 中的 key 和  value 都可以是任何引用类型的数据,Map 中的 Key 不允许重复,即同一个 Map 对象的任何两个 Key 通过 equals 方法比较中返回 false。Key 和 Value 之间存在单向一对一关系,即通过指定的 Key 总能找到唯一的,确定的 Value。

void clear():删除该Map对象中所有的key-value对。也就是清理该集合;

boolean containsKey(Object key):查询Map中是否包含指定的key;

boolean containsValue(Object  value):查询Map中是否包含至少一个value;

Set entrySet():返回Map所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map内部类);

Object get(Object key):返回指定key所对应的value,若此Map中不包含该key,返回null;

boolean isEmpty():判断Map集合是否为空;

Set keySet():返回该Map中所有key所组成的Set集合;

Object put(Object key,Object value):添加一个key-value对,若Map中已有与key相等的key-value对,则新的key-value对覆盖原来的key-value对;

void putAll(Map m):将m中的key-value赋值到调用该方法的Map对象中;

Object remove(Object key):删除指定key所对应的key-value对,返回本删除key所关联的value,若key不存在,返回null;

int size():返回该Map里面key-value对的个数;

Collection values():返回Map里所有value组成的Collection。

  • Map.Entry

Entry是Map接口里面的一个内部接口。该接口用于封装key- value,有3个方法:

Object getKey();返回Entry里包含的key值

Object getValue();返回Entry里包含的value值

Object setValue(Object value):设置Entry里包含的value值,并返回新设置的value值。



  • Map集合的输出

按照最正统的做法,所有的Map集合的内容都要依靠Iterator输出,以上虽然是完成了输出,但是完成的不标准,Map集合本身并不能直接为Iterator实例化,如果此时非要使用Iterator输出Map集合中内容的话,则要采用如下的步骤:

方法一:

1.通过entrySet方法变成Set对象

2.调用Set的Iterator方法,此时每个Iterator对象是Map.Entry对象

3.对Map.Entry分离出 key - value

方法二:

1.通过keySet得到Map集合多有key的Set集合

2.调用Set的Iterator方法,此时每个Iterator对象是key值

3.通过Map的getValue(key)得到value值

  • Map集合常用类

Hashtable:线程安全,速度慢,不允许存放null键,null值,已被HashMap替代,无序存放。很老的Map实现类,比Map接口更老,很少使用。

HashMap:线程不安全,速度快,允许存放null键,null值。类中的key都属于无序存放的。如果在HashMap中有key值重复,那么后面一条记录的value覆盖前面一条记录。HashMap里的key存储和保存HashSet里面的元素一致,若自定义类作为HashMap或Hashtable的key:当两个key对象的equals方法返回true时,两个key对象的hashCode值也应一样。在实际开发中一般不会用自定义的类型作为Map的Key,做Key的无非是八中封装类,一般都是字符串,如果使用自定义类,一定要覆盖HashCode()和equals()。这个实现类是使用的最多的,我一般也就只使用过这个类而已。如何具体的理解HashMap,记住下面几句话就好:HashMap底层也是用数组,HashSet底层实际上也是HashMap,HashSet类中有HashMap属性(查API)。 
     HashSet 实际上为(key.null)类型的HashMap。有key 值而没有value 值。

Hashtable 、HashMap 判断两个 Key 相等的标准是:两个 Key 通过 equals 方法返回 true,hashCode 值也相等。

Hashtable 、HashMap 判断两个 Value相等的标准是:两个 Value 通过 equals 方法返回 true。


注意:与 HashSet 集合不能保证元素的顺序的顺序一样,Hashtable 、HashMap 也不能保证其中 key-value 对的顺序

TreeMap:对key进行排序,排序原理与TreeSet相同。HashMap子类中的key都属于无序存放的,如果现在希望有序(按key排序)则可以使用TreeMap类完成,但是需要注意的是,由于此类需要按照key进行排序,而且key本身也是对象,那么对象所在的类就必须实现Comparable接口。

使用  HashMap的时候 key和 value都可以保存为  nulll;当 使用 TreeMap 的时候  key不能为null,value可以是 null;



  • TreeMap对key的排序方式:

TreeMap 存储 Key-Value 对时,需要根据 Key 对 key-value 对进行排序。TreeMap 可以保证所有的 Key-Value 对处于有序状态。

自然排序:TreeMap 的所有的 Key 必须实现 Comparable 接口,而且所有的 Key 应该是同一个类的对象,否则将会抛出 ClasssCastException

定制排序:创建 TreeMap 时,传入一个 Comparator 对象,该对象负责对 TreeMap 中的所有 key 进行排序。此时不需要 Map 的 Key 实现 Comparable 接口

TreeMap判断两个key元素是否相等标准(和HashSet一样):compareTo方法或compare方法返回0。



  • LinkedHashMap

LinkedHashMap 是 HashMap 的子类,底层采用链表来维护内部关系的。

LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与 Key-Value 对的插入顺序一致。



import java.util.LinkedHashMap;
import java.util.Map; public class Linkin
{
public static void main(String[] args)
{
Map<String, Integer> scores = new LinkedHashMap<String, Integer>();
scores.put("语文", 100);
scores.put("数学", 99);
scores.put("科学", 98);
for (String string : scores.keySet()) {
System.out.println(string+":"+scores.get(string));
}
}
}
  • Properties:Hashtable子类

Properties类的主要功能是用于操作属性,在各个语言(包括操作系统)都会存在着许多的配置文件。所有的属性文件中的属性都是按照“key=value”的形式保存的,而且保存的内容都是String(字符串)。





Properties 类是 Hashtable 的子类,该对象用于处理属性文件。由于属性文件里的 key、value 都是字符串类型,所以 properties 里的 Key 和 Value 都是字符串类型的。

public Object setProperty(String key,String value):设置属性;

public String getProperty(String key):根据属性的名字取得属性的内容,如果没有返回null结果;

public String getProperty(String key,String defaultValue):根据属性的名字取得属性内容,如果没有则返回默认值(defaultValue);

void load(InputStream/Reader inStream) 

void loadFromXML(InputStream in) 

public void list(PrintStream out):从一个输出流中显示所有的属性内容;

public void store(OutputStream/Writer out, String comments)

public void storeToXML(OutputStream os, String comment)





最后下面的代码演示了如何使用Map实现缓存机制:

import java.util.HashMap;
import java.util.Map; /**
*
* @version 1L
* @author LinkinPark
* @since 2014-11-12
* @motto 梦似烟花心似水,同学少年不言情
* @desc ^使用Map实现缓存机制
*/
class Axe {
private String name; public Axe(String name) {
this.name = name;
}
public void work() {
System.out.println(name + "砍柴");
}
} public class CacheByMap {
static Map<String, Axe> cacheMap = new HashMap<String, Axe>(); public static void main(String[] args)
{
Axe myAxe = null;
if (!cacheMap.containsKey("myAxe"))
{
myAxe = new Axe("linkinPark。。。");
cacheMap.put("myAxe", myAxe);
}
myAxe.work();
//上面已经将Axe这个对象放到了一个静态Map里面做了缓存
myAxe.work();
}
}



















linkin大话数据结构--Map的更多相关文章

  1. linkin大话数据结构--Collection和Iterator

    linkin大话数据结构--Collection和Iterator Java 集合就像一种容器,可以把多个对象的引用放入容器中.Java 集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系 ...

  2. linkin大话数据结构--泛型

    泛型(Generic) 什么是泛型? java5开始出现的一种对Java语言类型的一种拓展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数类型时指定的类型占位符,就好比方法的形式参数 ...

  3. linkin大话数据结构--字符串,数组,list之间的互转

    在实际开发中,我们经常会用到字符串,字符数组,字符list,当然也会不可避免的进行这3者之间的互相转换. 在使用到Apache和Google下的common包,可以这样子实现: package tz. ...

  4. linkin大话数据结构--Google commons工具类

    package tz.web.dao.bean; import java.util.Arrays; import java.util.Collection; import java.util.List ...

  5. linkin大话数据结构--apache commons工具类

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动. 一.Commons BeanUtils 说明:针对Bean的一个工具集.由于Bean往往是有一堆ge ...

  6. linkin大话数据结构--Collections类

    操作集合的工具类:Collections Collections 是一个操作 Set.List 和 Map 等集合的工具类.Collections 中提供了大量方法对集合元素进行排序.查询和修改等操作 ...

  7. linkin大话数据结构--Queue

    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必按顺序存储,所以插入和删除速度超 ...

  8. linkin大话数据结构--List

    List:Collection子接口 List是有序的集合,集合中每个元素都有对应的顺序序列.List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元 ...

  9. linkin大话数据结构--数组

    数组概述:如何正确理解数组?数组也是一种类型 数组是多个相同类型数据的组合,实现对这些数据的统一管理.数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量数组中的元 ...

随机推荐

  1. Python网络编程篇之socket

    1 socket 插座?呵呵,想多了,翻译过来意思是套接字! A network socket is an internal endpoint for sending or receiving dat ...

  2. islider结合react的简单实用

    我用islider都是结合react来使用,主要运用在移动端,做首页轮播图,或者是手机图片预览,左右滑动 首先需要 npm install islider.js --save 让后在jsx文件头部引入 ...

  3. Redis的key过期处理策略

    Redis中有三种处理策略:定时删除.惰性删除和定期删除. 定时删除:在设置键的过期时间的时候创建一个定时器,当过期时间到的时候立马执行删除操作.不过这种处理方式是即时的,不管这个时间内有多少过期键, ...

  4. 使用 requirejs 打包 jQuery 插件 datetimepicker 的问题记录

    网站之前用的时间选择 UI 实在太丑,而且功能单一,决定全站改用 https://github.com/xdan/datetimepicker/ 里面有好几个 js,奇怪的是,只有 /build 目录 ...

  5. Coursera课程 Programming Languages, Part B 总结

    Programming Languages, Part A Programming Languages, Part B Part A 笔记 碎言碎语 很多没有写过 Lisp 程序的人都会对 Lisp ...

  6. web.xml解析

    常用元素及含义 <!-- standalone 定义了外部定义的 DTD 文件的存在性,有效值是 yes和 no --> <?xml version="1.0" ...

  7. 推荐几个不错的 java 教程和 HTML 教程

    Java入门第一季 Java入门第二季 2小时学会Spring Boot Java模板引擎之Freemarker HTML+CSS基础课程 H5+JS+CSS3实现七夕言情 jQuery基础系列

  8. 【JavaScript流程控制语句的用法及练习】

    1.做判断(if语句) if语句是基于条件成立才执行相应代码时使用的语句. 语法:  if(条件){  条件成立时执行代码   } 例子:1.假设你应聘web前端技术开发岗位,如果你会HTML技术,你 ...

  9. BC#65 T5 ZYB's Prime

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5594 完全不会啊TAT.. 其实官方题解已经说的很清楚了.. #include <cstdio> ...

  10. jquery实现上下滑动选择

    $('.rightShow').on('mousewheel', function(ev) { var dir = ev.originalEvent.wheelDelta if(dir == 120) ...