一个非常有趣的问题,因为它需要了解什么是地图......
- 我们可以将密钥设为单例吗?
如果您使用单例模式生成键,那么显然只会创建一个键,然后地图中一次只会出现一对 (key,value)。这就是说,我们显然更改了与唯一可能的键关联的值。这个答案当然是肯定的,key 的本质对地图来说并不重要,但这会导致地图愚蠢或不是很有用(至少给我一个令人信服的例子)。
- 我们能否将 hashmap 的键设置为可变或不可变,您将使用哪一个
选择,为什么?
选择不可变的!否则,根据您选择的具体地图,您将遇到严重的问题。
对于HashMap 等:
import java.util.*;
class K {
private int value;
public boolean equals(Object o) { K k = (K)o; return k.value==value; }
public int hashCode() { return value; }
public K(int v) { this.value = v; }
public void setValue(int v) { this.value = v; }
public String toString() { return ""+value; }
}
public class Test {
public static void main(String []a) {
HashMap<K,String> m = new HashMap<K,String>();
K k1 = new K(33);
m.put(k1,"Here I am");
K k2 = new K(44);
m.put(k2,"Here it is");
System.out.println("k1: "+k1+" "+m.get(k1));
System.out.println("k2: "+k2+" "+m.get(k2));
k1.setValue(666);
System.out.println("k1: "+k1+" "+m.get(k1));
k1.setValue(44);
System.out.println("k2: "+k2+" "+m.get(k2));
k1.setValue(666);
System.out.println("k1: "+k1+" "+m.get(k1));
k1.setValue(33);
System.out.println("k1: "+k1+" "+m.get(k1));
}
}
将产生:
k1: 33 Here I am
k2: 44 Here it is
k1: 666 null
k2: 44 Here it is
k1: 666 null
k1: 33 Here I am
这自然是可以理解的,对象键中的值作为映射的键。
现在有了TreeMap,情况就不同了:
import java.util.*;
class K implements Comparable<K> {
private int value;
public boolean equals(Object o) { K k = (K)o; return k.value==value; }
public int hashCode() { return value; }
public K(int v) { this.value = v; }
public void setValue(int v) { this.value = v; }
public String toString() { return ""+value; }
public int compareTo(K k) { return Integer.compare(value,k.value); }
}
public class Test2 {
public static void main(String []a) {
TreeMap<K,String> m = new TreeMap<K,String>();
K k1 = new K(33);
m.put(k1,"Here I am");
K k2 = new K(44);
m.put(k2,"Here it is");
System.out.println("k1: "+k1+" "+m.get(k1));
System.out.println("k2: "+k2+" "+m.get(k2));
k1.setValue(666);
System.out.println("k1: "+k1+" "+m.get(k1));
k1.setValue(44);
System.out.println("k2: "+k2+" "+m.get(k2));
k1.setValue(666);
System.out.println("k1: "+k1+" "+m.get(k1));
k1.setValue(33);
System.out.println("k1: "+k1+" "+m.get(k1));
}
}
将产生:
k1: 33 Here I am
k2: 44 Here it is
k1: 666 Here I am
k2: 44 Here I am
k1: 666 Here I am
k1: 33 Here I am
看看 k2 和 value 44 现在如何访问映射中的不同值...k2 没有变异,但检索到的值随着时间的推移而不同!
因此,永远不要使用可变键...