Map里面使用率最多的,应该是HashMap吧,我们先来看看这个
运行结果(已经包含在源代码里)
null=>测试null的键;
null=>测试null的键; 测试null的值=>null;
以前的值=测试null的键
null=>null; 测试null的值=>null;
111111
null
第二个对象-修改=>2222222---; 第一个对象-修改=>null;
- package collection.lession12;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.Map;
- /**
- * 老紫竹JAVA提高教程(12)-认识Map之HashMap<br>
- * 基于哈希表的 Map 接口的实现。<br>
- * 一个映射不能包含重复的键;每个键最多只能映射到一个值。<br>
- * <br>
- * 相关API请查看 api.java2000.net/Map
- *
- * @author 老紫竹 JAVA世纪网(java2000.net)
- */
- public class Lession12 {
- public static void main(String[] args) {
- // 我们用String做所有的测试
- HashMap<String, String> map = new HashMap<String, String>();
- // 允许null作为Key.
- // 看看源代码实现就知道了
- // if (key == null)
- // return putForNullKey(value);
- map.put(null, "测试null的键");
- showMap(map); // null=>测试null的键;
- // 当然也允许null的Value了
- map.put("测试null的值", null);
- showMap(map); // null=>测试null的键; 测试null的值=>null;
- // 对应的都是null
- // 注意这个null替换了前面的"Null Key"字符串的value了
- // 也就是后面的相同的key会替换以前的key对应的value
- // 返回值为以前的值
- System.out.println("以前的值=" + map.put(null, null)); // 以前的值=测试null的键
- showMap(map); // null=>null; 测试null的值=>null;
- // 其它的和Map相同的操作就不介绍了
- // 这里介绍一下Hash的特殊的地方
- // 大家使用时一定要注意,其实和HashSet有相同的地方
- // 那就是通过Key的Hashcode进行查找
- Map<MyObject, String> map2 = new HashMap<MyObject, String>();
- MyObject key1 = new MyObject("第一个对象");
- MyObject key2 = new MyObject("第二个对象");
- MyObject key3 = new MyObject("第三个对象");
- map2.put(key1, "111111");
- map2.put(key2, "222222");
- // 我们来测试读取第一个
- System.out.println(map2.get(key1)); // 111111
- // 我们尝试修改key1的name
- key1.setName("第一个对象-修改");
- // 我们再次测试读取第一个
- // 没有找到哦!
- System.out.println(map2.get(key1)); // null
- // 总结
- // HashSet一定要注意hashCode的问题
- // 对于String等不可修改类无所谓
- // 但对于普通类,一定要注意其hashCode的实现方式
- // 千万不要让一个类的hashCode随便变动
- // 如果非得更新,应该先删除,后修改
- map2.remove(key2);
- key2.setName("第二个对象-修改");
- map2.put(key2, "2222222---");
- showMap(map2); // 第二个对象-修改=>2222222---; 第一个对象-修改=>null;
- // 对Value则没有这个限制
- }
- public static void showMap(Map map) {
- // 迭代Key的操作
- Iterator it = map.keySet().iterator();
- Object key;
- while (it.hasNext()) {
- key = it.next();
- System.out.print(key + "=>" + map.get(key) + "; ");
- }
- System.out.println();
- }
- }
- class MyObject {
- private String name;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- MyObject(String name) {
- this.name = name;
- }
- // 注意这里使用name的hashCode作为类的hashCode
- public int hashCode() {
- return name.hashCode();
- }
- public String toString() {
- return name;
- }
- }
null=>测试null的键;
null=>测试null的键; 测试null的值=>null;
以前的值=测试null的键
null=>null; 测试null的值=>null;
111111
null
第二个对象-修改=>2222222---; 第一个对象-修改=>null;