1.定义
Collection接口是保存单值的最大父接口,Map接口则是保存一对值.全部的内容是以key--->value的形式保存的.Map接口经常使用的子类有三个. java
- HashMap
- HashTable
- TreeMap
2.新的子类HashMap
示例1: 安全
package com.ares.mapdemo; import java.util.HashMap; import java.util.Map; public class HashMapDemo01 { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); System.out.println(map) ; } }
输出结果: {zhangsan=2,lisi=3,wangwu=5} 异步
注:HashMap中key不容许有重复的值,因此当属性重复时会被覆盖.其最大的特色是用于内容的查找,查找成功则返回内容,不然返回空. 性能
查找操做: Integer value = map.get("zhangsan") ; 学习
示例2:将Map中的key所有以Set的集合的形式返回. this
Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); Set<String> set = map.keySet(); // 返回所有的key Iterator<String> iter = set.iterator(); while (iter.hasNext()) { System.out.println(iter.next()); }
注:注意的是重复的key内容仍然不会显示,会被过滤掉.HashMap中key也是散列的. spa
示例3:将Map中的value以Collection集合形式返回. 线程
Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); Collection<Integer> col = map.values();// 取得所有value Iterator<Integer> iter = col.iterator(); while (iter.hasNext()) { Integer value = iter.next(); System.out.println(value); }
3.旧的子类HashTable
HashTable与Vector的产生时代是同样的,也属于最先的集合操做类,以后扩展了其应用实现了Map接口. code
使用上与HashMap相像. orm
示例:
Map<String, Integer> map = new Hashtable<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); System.out.println(map);
HashMap与HashTable的区别:
两者都是Map接口的子类.HashMap采用的是异步的处理操做,而HashTable是同步,因此HashMap性能较高,HashTable是线程安全的.
4.TreeMap类
TreeMap是按key排序的输出.
Map<String, Integer> map = new TreeMap<String, Integer>(); map.put("A、zhangsan", 1); map.put("A、zhangsan", 2); map.put("C、lisi", 3); map.put("B、wangwu", 5); Set<String> set = map.keySet(); // 返回所有的key Iterator<String> iter = set.iterator(); while (iter.hasNext()) { String key = iter.next(); System.out.println(key + " --> " + map.get(key)); }
输出是根据key排序后的结果,分别是A,B,C.若是是给定的任意的类要直接排序则须要实现Comparable接口.
5.注意事项
5.1 Map不能直接使用Iterator输出
要想输出须要借助Set,标准操做格式以下
示例:
package com.ares.iteartordemo; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class IteartorMapDemo { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("zhangsan", 1); map.put("zhangsan", 2); map.put("lisi", 3); map.put("wangwu", 5); Set<Map.Entry<String, Integer>> allSet = null; //经过Set来完成 allSet = map.entrySet(); Iterator<Map.Entry<String, Integer>> iter = allSet.iterator(); while (iter.hasNext()) { Map.Entry<String, Integer> me = iter.next(); System.out.println(me.getKey() + " --> " + me.getValue()); } } }
另外也能够用foreach输出:
for (Map.Entry<String,Integer> me : map.entrySet()) { System.out.println(me.getKey() + " --> " + me.getValue()); }
5.2使用非系统类做为key
示例1:
Map<String, Person> map = new HashMap<String, Person>(); map.put(new String("zs"), new Person("张三", 30)); System.out.println(map.get("zs")); //System.out.println(map.get(new String("zs"))); //均可以打印出:Person的toString方法.
在Map中能够经过一个匿名对象找到key对应的value.
示例2:
Map<Person, String> map = new HashMap<Person, String>(); map.put(new Person("张三", 30), "zs"); System.out.println(map.get(new Person("张三", 30))); //但这个却不能打印出:Person的toString方法.结果为null
这样子却找不到key对应的value.为何示例一的String就能够呢?
这里须要注意的是须要在Person类中覆写equals()方法和hasHashCode()方法来区分是不是同一个对象.
也就是说只要是非系统类做为key操做的话就必须覆写,不然会找不到.
示例:
package org.lxh.mapdemo; public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public boolean equals(Object obj) { if (this == obj) { return true; } if (!(obj instanceof Person)) { return false; } Person p = (Person) obj; if (this.name.equals(p.name) && this.age == p.age) { return true; } else { return false; } } public int hashCode() { // 这个方法的返回值都是经过一个公式计算的 // 此时的公式:名字的hashCode * age return this.name.hashCode() * this.age; } public String toString() { // 覆写toString() return "姓名:" + this.name + ";年龄:" + this.age; } }
5.3 其余子类: IdentityHashMap
通常正常状况下,Map集合中的key是不能重复的,这种作法是Map的标准作法,但在集合中提供了一种非正常的操做类:IdentityHashMap,只要对象地址不一样,则能够重复加.
示例:
package com.ares.mapdemo; import java.util.IdentityHashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class IdentityHashMapDemo { public static void main(String[] args) { Map<String, Integer> map = new IdentityHashMap<String, Integer>(); map.put(new String("zhangsan"), 1); map.put(new String("zhangsan"), 2); Set<String> set = map.keySet(); // 返回所有的key Iterator<String> iter = set.iterator(); while (iter.hasNext()) { String key = iter.next(); System.out.println(key + " --> " + map.get(key)); } } }
须要注意的是若是用的是HashMap则只会输出一个key-value.
20150519
JAVA学习笔记系列
--------------------------------------------
联系方式
--------------------------------------------
Weibo: ARESXIONG
E-Mail: aresxdy@gmail.com
------------------------------------------------