• 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并发之多线程

    一开启线程的两种方式 from threading import Thread import time def haha(name): time.sleep(2) print('%s 你大爷..... ...

  2. Oracle loop循环无法插入数据

    以下的测试基于scott用户下的emp表 首先用while循环进行测试,向emp表插入999条数据 declare i emp.empno; begin loop insert into emp(em ...

  3. 解决api 跨域 webconfig添加节点

    <system.webServer><httpProtocol><customHeaders><add name="Access-Control-A ...

  4. swiper插件的简单使用,实现图片轮播

    移动端和p c端经常会遇到写轮播图的情况,这里只是简单的说一下swiper插件的简单用法(移动端为例). <!DOCTYPE html> <html lang="en&qu ...

  5. MATLAB数字图像处理学习笔记

    我们都知道一幅图片就相当于一个二维数组,可以用一个矩阵来表示,而MATLAB可以说就是为矩阵运算而生的,所以学习图像处理,学习MATLAB势在必行! 一. MATLAB基础知识 1. 读取图像 %im ...

  6. hdu_1370Biorhythms(互素的中国剩余定理)

    Biorhythms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. 关于解决Git项目本地修改代码之后执行pull操作之后报错的问题

    解决办法: 注意!该方法执行后会导致远程仓库覆盖本地仓库的文件,如果不需要对本地文件进行保存,可以无视,若之后还需要用到,请备份所报错文件! 1.Eclipse中选中项目右键-->Team--& ...

  8. 《SpringMVC从入门到放肆》四、SpringMVC配置式开发(处理器映射器)

    上一篇我们讲解了DispatcherServlet的url-pattern配置详解,今天我们来真正对SpringMVC进行配置式开发.所谓配置式开发是指“处理器类是程序员自己定义的.实现了特定接口的类 ...

  9. linux下如何删除文件夹?

    直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字-r 就是向下递归,不管有多少级目录,一并删除:-f 就是直接强行删除,不作任何提示的意思. 例如:删除文件夹实例: rm -rf ...

  10. Kubernetes v1.6开始支持RBAC

    Kubernetes v1.6的一个亮点就是RBAC认证特性成为了beta版本.RBAC,基于角色的访问控制(Role-Based Access Control),是用于管理Kubernetes资源访 ...