JAVA程序员提高教程(12)-认识Map之HashMap

    作者:课课家教育更新于: 2016-02-03 13:55:48

    大神带你学编程,欢迎选课

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

    JAVA程序员提高教程(12)-认识Map之HashMap_java课程标准_21天学通java_课课家

      1.package collection.lession12;

      2.

      3.import java.util.HashMap;

      4.import java.util.Iterator;

      5.import java.util.Map;

      6.

      7./**

      9. * 基于哈希表的 Map 接口的实现。

      10. * 一个映射不能包含重复的键;每个键最多只能映射到一个值。

      11. *

      13. *

      15. */

      16.public class Lession12 {

      17.

      18. public static void main(String[] args) {

      19. // 我们用String做所有的测试

      20. HashMap map = new HashMap();

      21.

      22. // 允许null作为Key.

      23. // 看看源代码实现就知道了

      24. // if (key == null)

      25. // return putForNullKey(value);

      26. map.put(null, "测试null的键");

      27. showMap(map); // null=>测试null的键;

      28.

      29. // 当然也允许null的Value了

      30. map.put("测试null的值", null);

      31. showMap(map); // null=>测试null的键; 测试null的值=>null;

      32.

      33. // 对应的都是null

      34. // 注意这个null替换了前面的"Null Key"字符串的value了

      35. // 也就是后面的相同的key会替换以前的key对应的value

      36. // 返回值为以前的值

      37. System.out.println("以前的值=" + map.put(null, null)); // 以前的值=测试null的键

      38. showMap(map); // null=>null; 测试null的值=>null;

      39.

      40. // 其它的和Map相同的操作就不介绍了

      41. // 这里介绍一下Hash的特殊的地方

      42. // 大家使用时一定要注意,其实和HashSet有相同的地方

      43. // 那就是通过Key的Hashcode进行查找

      44.

      45. Map map2 = new HashMap();

      46. MyObject key1 = new MyObject("第一个对象");

      47. MyObject key2 = new MyObject("第二个对象");

      48. MyObject key3 = new MyObject("第三个对象");

      49. map2.put(key1, "111111");

      50. map2.put(key2, "222222");

      51.

      52. // 我们来测试读取第一个

      53. System.out.println(map2.get(key1)); // 111111

      54.

      55. // 我们尝试修改key1的name

      56. key1.setName("第一个对象-修改");

      57.

      58. // 我们再次测试读取第一个

      59. // 没有找到哦!

      60. System.out.println(map2.get(key1)); // null

      61.

      62. // 总结

      63. // HashSet一定要注意hashCode的问题

      64. // 对于String等不可修改类无所谓

      65. // 但对于普通类,一定要注意其hashCode的实现方式

      66. // 千万不要让一个类的hashCode随便变动

      67. // 如果非得更新,应该先删除,后修改

      68. map2.remove(key2);

      69. key2.setName("第二个对象-修改");

      70. map2.put(key2, "2222222---");

      71. showMap(map2); // 第二个对象-修改=>2222222---; 第一个对象-修改=>null;

      72.

      73. // 对Value则没有这个限制

      74. }

      75.

      76. public static void showMap(Map map) {

      77. // 迭代Key的操作

      78. Iterator it = map.keySet().iterator();

      79. Object key;

      80. while (it.hasNext()) {

      81. key = it.next();

      82. System.out.print(key + "=>" + map.get(key) + "; ");

      83. }

      84. System.out.println();

      85. }

      86.}

      87.

      88.class MyObject {

      89.

      90. private String name;

      91.

      92. public String getName() {

      93. return name;

      94. }

      95.

      96. public void setName(String name) {

      97. this.name = name;

      98. }

      99.

      100. MyObject(String name) {

      101. this.name = name;

      102. }

      103.

      104. // 注意这里使用name的hashCode作为类的hashCode

      105. public int hashCode() {

      106. return name.hashCode();

      107. }

      108.

      109. public String toString() {

      110. return name;

      111. }

      112.}

      运行结果(已经包含在源代码里)

      null=>测试null的键;

      null=>测试null的键; 测试null的值=>null;

      以前的值=测试null的键

      null=>null; 测试null的值=>null;

      111111

      null

      第二个对象-修改=>2222222---; 第一个对象-修改=>null;

课课家教育

未登录