map作为集合体系中的一员存在,具有更为强大的通用性。它是以键值对的形式进行元素的存放的。key必须是唯一的存在。
让我们来创建一个map吧:
Map map = new HashMap();
这样就创建完毕了。创建好了我们当然要用它来存储数据了。
map.put("aaa","hello");
括号中前面的就是key了,后面的是value。千万不要弄错了哦。来看看map集合的常用方法吧。
Map集合常用方法
添加记录: put(K key, V value) 这个上面已经介绍了
删除记录: remove(Object key)
根据键获取值: get(Object key)
获取长度: size()
判断是否包含某个键: containsKey(Object o)
判断是否包含某个值: containsValue(Object o)
获取所有键组成的集合: keySet()
获取所有键值对组成的集合: entrySet()
这几个都是map通用的方法。比较重要的是后面的两个方法。集合的遍历需要他们来完成。要重点掌握。示例如下:
keySet:
System.out.println("使用keySet()进行遍历: ");
Map<Person, Integer> map = new HashMap<Person,Integer>();
map.put(new Person("aaa",20), 80);
map.put(new Person("bbb",22), 84);
map.put(new Person("ccc",24), 89);
Set<Person> keySet = map.keySet();
for(Iterator<Person> it = keySet.iterator(); it.hasNext(); ) {
Person p = it.next();
System.out.println(p + "-" + map.get(p));
}
entrySet:
System.out.println("使用entrySet()进行遍历: ");
Map<Person, Integer> map = new HashMap<Person,Integer>();
map.put(new Person("aaa",20), 80);
map.put(new Person("bbb",22), 84);
map.put(new Person("ccc",24), 89);
Set<Map.Entry<Person, Integer>> entrySet = map.entrySet();
for(Iterator<Map.Entry<Person, Integer>> it = entrySet.iterator(); it.hasNext(); ) {
Map.Entry<Person, Integer> entry = it.next();
System.out.println(entry.getKey() + "-" + entry.getValue());
}
千万要注意的一点是在遍历map集合的时候不要去改变元素的值,这样做会导致严重的问题。大家就不要去试了哦。
下面简单说说map的几种主要的实现类。
1.HashMap 在存储键值对的时候, 使用哈希算法对键对象去重复, 效率高, 没有顺序.
当存储一个键值对的时候, 先调用键对象的hashCode()方法计算一个哈希值, 在集合中查找是否有哈希值相同键对象.
如果没有哈希值相同的键对象, 直接将键值对存入.
如果有哈希值相同键对象, 则和哈希值相同的键对象进行equals()比较.
比较结果为false就存入键值对.
比较结果为true则用新的值覆盖旧的值.
2.TreeMap 在存储键值对的时候, 通过指定的比较算法, 对键对象进行排序, 以二叉树形式进行存储.
创建TreeMap时如果没有传入比较器, 则会按照键对象的自然顺序来排序. 自然顺序就是实现了Comparable接口之后compareTo方法中定义的顺序.
如果我们不希望使用自然顺序排序, 还在TreeMap的构造函数中可以传入一个比较器. 比较器就是实现了Comparator接口的对象, 按照其中compare方法排序.
3.LinkedHashMap HashMap的子类, 实现原理和HashMap相同, 但是可以保留存储顺序.
4.Hashtable Hashtable和HashMap原理相同, 都是基于哈希算法的, Hashtable是线程安全的, 而且Hashtable不允许存储空的键和空的值.
5.Properties Hashtable的子类, 通常用来操作配置文件.
使用setProperty(String, String)方法来设置一个配置项
使用getProperty(String)来获取一个配置项的值
使用propertyNames()方法获取所有Key对象的Enumeration
使用load(InputStream)来加载数据
使用list(PrintStream)来写出数据