• 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. 使用fruitstrap实现命令行将IPA包安装到iOS设备上

    Requirements Mac OS X. Tested on Snow Leopard only. You need to have a valid iPhone development cert ...

  2. asp.net mvc 客户端验证

    插件 jQuery unobtrusive Validation @Html.TextBoxFor(x=>x.UserName) [StringLength(7,MinimumLength=2, ...

  3. Java关于BufferedWriter.newline()换行的注意事项

    最近项目中需要导出文件,其实导出文件是一个挺简单的事情.但是却遇到了很奇怪的问题. 首先导出到文件需要用到 BufferedWriter.而换行则是通过 bw.newline() 方法,问题将出在 n ...

  4. 看JQ时代过来的前端,如何转换思路用Vue打造选项卡组件

    前言 在Vue还未流行的时候,我们都是用JQuery来封装一个选项卡插件,如今Vue当道,让我们一起来看看从JQ时代过来的前端是如何转换思路,用数据驱动DOM的思想打造一个Vue选项卡组件. 接下来, ...

  5. 借助Redis做秒杀和限流的思考

    最近群里聊起秒杀和限流,我自己没有做过类似应用,但是工作中遇到过更大的数据和并发. 于是提出了一个简单的模型: var count = rds.inc(key); if(count > 1000 ...

  6. python文件处理相关函数

    用open()创建文件 open('a.txt','wt') 用exists()检查文件是否存在 os.path.exists() 用isfile()检查是否为文件 os.path.isfile(na ...

  7. 自定义注解,andjdk提供的元注解

    @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface FruitN ...

  8. 《SpringMVC从入门到放肆》一、概述

    一.SpringMVC概述 View Service Dao DB Spring MVC interface interface Mysql impls impls SpringMVC也叫Spring ...

  9. Vue入门

    一.引入vue 方法一:下载vue.js,然后像引用jquery一样,在HTML中使用script标签引入 <script src="https://unpkg.com/vue/dis ...

  10. Angular02 通过angular-cli来搭建web前端项目

    利用angular-cli的常见命令: npm i --save 包名   ->  软件依赖    npm i --save-dev 包名     ->  开发依赖    ng new 项 ...