老紫竹JAVA提高教程(12)-认识Map之HashMap

 Map里面使用率最多的,应该是HashMap吧,我们先来看看这个

  1. package collection.lession12;
  2. import java.util.HashMap;
  3. import java.util.Iterator;
  4. import java.util.Map;
  5. /**
  6.  * 老紫竹JAVA提高教程(12)-认识Map之HashMap<br>
  7.  * 基于哈希表的 Map 接口的实现。<br>
  8.  * 一个映射不能包含重复的键;每个键最多只能映射到一个值。<br>
  9.  * <br>
  10.  * 相关API请查看 api.java2000.net/Map
  11.  * 
  12.  * @author 老紫竹 JAVA世纪网(java2000.net)
  13.  */
  14. public class Lession12 {
  15.   public static void main(String[] args) {
  16.     // 我们用String做所有的测试
  17.     HashMap<String, String> map = new HashMap<String, String>();
  18.     // 允许null作为Key.
  19.     // 看看源代码实现就知道了
  20.     // if (key == null)
  21.     // return putForNullKey(value);
  22.     map.put(null"测试null的键");
  23.     showMap(map); // null=>测试null的键;
  24.     // 当然也允许null的Value了
  25.     map.put("测试null的值"null);
  26.     showMap(map); // null=>测试null的键; 测试null的值=>null;
  27.     // 对应的都是null
  28.     // 注意这个null替换了前面的"Null Key"字符串的value了
  29.     // 也就是后面的相同的key会替换以前的key对应的value
  30.     // 返回值为以前的值
  31.     System.out.println("以前的值=" + map.put(nullnull)); // 以前的值=测试null的键
  32.     showMap(map); // null=>null; 测试null的值=>null;
  33.     // 其它的和Map相同的操作就不介绍了
  34.     // 这里介绍一下Hash的特殊的地方
  35.     // 大家使用时一定要注意,其实和HashSet有相同的地方
  36.     // 那就是通过Key的Hashcode进行查找
  37.     Map<MyObject, String> map2 = new HashMap<MyObject, String>();
  38.     MyObject key1 = new MyObject("第一个对象");
  39.     MyObject key2 = new MyObject("第二个对象");
  40.     MyObject key3 = new MyObject("第三个对象");
  41.     map2.put(key1, "111111");
  42.     map2.put(key2, "222222");
  43.     // 我们来测试读取第一个
  44.     System.out.println(map2.get(key1)); // 111111
  45.     // 我们尝试修改key1的name
  46.     key1.setName("第一个对象-修改");
  47.     // 我们再次测试读取第一个
  48.     // 没有找到哦!
  49.     System.out.println(map2.get(key1)); // null
  50.     // 总结
  51.     // HashSet一定要注意hashCode的问题
  52.     // 对于String等不可修改类无所谓
  53.     // 但对于普通类,一定要注意其hashCode的实现方式
  54.     // 千万不要让一个类的hashCode随便变动
  55.     // 如果非得更新,应该先删除,后修改
  56.     map2.remove(key2);
  57.     key2.setName("第二个对象-修改");
  58.     map2.put(key2, "2222222---");
  59.     showMap(map2); // 第二个对象-修改=>2222222---; 第一个对象-修改=>null;
  60.     // 对Value则没有这个限制
  61.   }
  62.   public static void showMap(Map map) {
  63.     // 迭代Key的操作
  64.     Iterator it = map.keySet().iterator();
  65.     Object key;
  66.     while (it.hasNext()) {
  67.       key = it.next();
  68.       System.out.print(key + "=>" + map.get(key) + "; ");
  69.     }
  70.     System.out.println();
  71.   }
  72. }
  73. class MyObject {
  74.   private String name;
  75.   public String getName() {
  76.     return name;
  77.   }
  78.   public void setName(String name) {
  79.     this.name = name;
  80.   }
  81.   MyObject(String name) {
  82.     this.name = name;
  83.   }
  84.   // 注意这里使用name的hashCode作为类的hashCode
  85.   public int hashCode() {
  86.     return name.hashCode();
  87.   }
  88.   public String toString() {
  89.     return name;
  90.   }
  91. }
运行结果(已经包含在源代码里)
null=>测试null的键;
null=>测试null的键; 测试null的值=>null;
以前的值=测试null的键
null=>null; 测试null的值=>null;
111111
null
第二个对象-修改=>2222222---; 第一个对象-修改=>null;

你可能感兴趣的:(java,.net,String,测试,HashMap,null)