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

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

1.package collection.lession12;
2.
3.import java.util.HashMap;
4.import java.util.Iterator;
5.import java.util.Map;
6.
7./**
8. * 老紫竹JAVA提高教程(12)-认识Map之HashMap<br>
9. * 基于哈希表的 Map 接口的实现。<br>
10. * 一个映射不能包含重复的键;每个键最多只能映射到一个值。<br>
11. * <br>
12. * 相关API请查看 api.java2000.net/Map
13. *
14. * @author 老紫竹 JAVA世纪网(java2000.net)
15. */
16.public class Lession12 {
17.
18. public static void main(String[] args) {
19. // 我们用String做所有的测试
20. HashMap<String, String> map = new HashMap<String, String>();
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<MyObject, String> map2 = new HashMap<MyObject, String>();
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;

时间: 2024-11-30 09:04:20

JAVA提高教程(12)-认识Map之HashMap的相关文章

JAVA提高教程(14)-认识Map之LinkedHashMap

Java基础及提高教程目录 Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序.此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序).注意,如果在映射中重新插入 键,则插入顺序不受影响.(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中.) 此实现可以让客户避免未指定的.由 HashMap(及

JAVA提高教程(13)-认识Map之Hashtable

这个类,在使用上和HashMap的区别不大,其方法都是同步的(Synchronized). 1.package collection.lession13; 2. 3.import java.util.Hashtable; 4. 5./** 6. * 老紫竹JAVA提高教程(13)-认识Map之Hashtable<br> 7. * 这个类继承自一个已经过期不推荐使用的Dictionary类<br> 8. * 目前均推荐实现Map接口<br> 9. * 10. * 11.

JAVA提高教程(11)-认识Map

Map可以为某些数据提供快速查找功能,通过关键字(key)可以快速的得到对应的 Value,而不用像List那样需要大范围的遍历或特别的算法. 1. 源代码 1.import java.util.ArrayList; 2.import java.util.HashMap; 3.import java.util.HashSet; 4.import java.util.Iterator; 5.import java.util.List; 6.import java.util.Map; 7.impor

JAVA提高教程(10)-认识List列表之Stack

不多说,我们直接看源代码 1.package collection.lession10; 2. 3.import java.util.Arrays; 4.import java.util.List; 5.import java.util.Stack; 6. 7./** 8. * 老紫竹JAVA提高教程(10)-认识List列表之Stack<br> 9. * 实现了LIFO的对象堆栈,<br> 10. * 类本身继承自Vector,扩展了一些方法<br> 11. * &l

JAVA提高教程(9)-认识List列表之LinkedList

LinkedList提供了将链接列表用作堆栈.队列或双端队列的方法,这里不再重复介绍 List的标准操作,只给出其独特方法的使用. 请注意其已经实现的接口 Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E> 1.package collection.lession9; 2. 3.import java.util.Arrays; 4.imp

JAVA提高教程(8)-认识List列表之Vector

Vector和ArrayList的最大区别就是Vector的主要集合方法是线程同步的. 1.package collection.lession8; 2. 3.import java.util.Arrays; 4.import java.util.Collection; 5.import java.util.Enumeration; 6.import java.util.Iterator; 7.import java.util.List; 8.import java.util.Vector; 9

JAVA提高教程(6)-认识List列表

列表是很常用的数据结构,感觉比Map和Set用的频率要高一些吧,因为我经常用其返 回数据库的操作结果集 package collection.lession6; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Stack; import

JAVA提高教程(5)-认识Set集合之EnumSet

这个类是1.5开始有的,目前个人使用量几乎为零,因为我很少使用枚举,呵呵.我这 里也是简单介绍一下而已.其使用方式和普通的Set没有区别,只是构造方法有一些特殊 的而已. 1.package collection.lession5; 2. 3.import java.util.Arrays; 4.import java.util.EnumSet; 5.import java.util.Set; 6. 7./** 8. * 老紫竹JAVA提高教程(5)-认识Set集合之EnumSet.<br>

JAVA提高教程(3)-认识Set集合之LinkedHashSet

有序的集合,就是LinkedList,内部通过双向链表实现,LinkedHashMap为基础. package collection.lession3; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; /** * 老紫竹JAVA提高教程(3)-认识Set集合之LinkedHashSet.<br> * <br> * Link