学习目标:
1、了解Map结构的数据特点
2、了解Map接口和HashMap实现类的常见用法
学习过程:
一、Map接口
Map意为映射,java.util.Map接口规定了一组通过键值对(key-value)方式组织的集合,键必须是唯一的,Map的数据也是不能保证顺序的,也就是Map中数据的顺序与放置数据的先后顺序无关。,其基本的操作是get 和 put,即放置数据和取数据,我们一般是通过键key获得其对应的值value。
我们在通过键取值时,不管数据量,一般其随机访问速度都是一致的,但是如果经常需要遍历整个Map的所有数据,那么Map可能就不是最好的选择。
二、HashMap实现
HaspMap实现了Map接口,所以在键值对存储关系中,顺序是无需考虑,对象放到HashMap中,所在的位置时由哈希来分布在集合中所在的位置,取值时一般不理会这个位置,而是通过键Key去索引取得对象。跟hashSet一样,Hash序列为HashMap的基本操作(get 和 put)提供稳定的性能。
常用方法:
void clear() //从此映射中移除所有映射关系。
boolean containsKey(Object key) //如果此映射包含对于指定键的映射关系,则返回 true。
boolean containsValue(Object value) //如果此映射将一个或多个键映射到指定值,则返回 true。
Set<Map.Entry
boolean isEmpty() //返回此映射所包含的映射关系的 Set 视图。
V get(Object key) 如果此映射不包含键-值映射关系,则返回 true。
Set
V put(K key, V value) 在此映射中关联指定值与指定键。
void putAll(Map
V remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。
int size() 返回此映射中的键-值映射关系数。
三、示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | public class Stu3 { public static void main(String[] args) { HashMap map = new HashMap(); Student stu1 = new Student(); stu1.setNum( 1 ); stu1.setName( "刘德华" ); Student stu2 = new Student(); stu2.setNum( 2 ); stu2.setName( "张学友" ); Student stu3 = new Student(); stu3.setNum( 3 ); stu3.setName( "曾志伟" ); Student stu4 = new Student(); stu4.setNum( 3 ); stu4.setName( "刘宝" ); // 添加 key=键 value=值 key唯一 map.put( "440602" , stu2); map.put( "440601" , stu1); map.put( "440603" , stu3); map.put( "440603" , stu4); // 删 // map.remove("440602"); System.out.println( "大小:" + map.size()); Student stu = (Student) map.get( "440601" ); System.out.println(stu.getName()); // 遍历 // 1、取得key。 Set keySet = map.keySet(); // 2、循环 迭代 Iterator iterator = keySet.iterator(); while (iterator.hasNext()) { Object object = iterator.next(); Student student = (Student) map.get(object.toString()); System.out.println(student.getNum() + ":" + student.getName()); } } |
Map的循环方式比较多,除了上面这种循环方式之外比较常用的一下四种方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | //第一种:普遍使用,二次取值 System.out.println( "通过Map.keySet遍历key和value:" ); for (String key : map.keySet()) { System.out.println( "key= " + key + " and value= " + map.get(key)); } //第二种 System.out.println( "通过Map.entrySet使用iterator遍历key和value:" ); Iterator<Map.Entry<String, String>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, String> entry = it.next(); System.out.println( "key= " + entry.getKey() + " and value= " + entry.getValue()); } //第三种:推荐,尤其是容量大时 System.out.println( "通过Map.entrySet遍历key和value" ); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println( "key= " + entry.getKey() + " and value= " + entry.getValue()); } //第四种 System.out.println( "通过Map.values()遍历所有的value,但不能遍历key" ); for (String v : map.values()) { System.out.println( "value= " + v); } } |
上面用到了for each循环,其中比较常用的是第三种,尤其是如果键值对都需要获取的时候,所以大家需要记忆第三种方式。