import java.util.HashMap; class Key { String s; Key(String s) { this.s = new String(s); } @Override public boolean equals(Object obj) { if (obj instanceof Key) { if (s.equals(((Key) obj).s)) { return true; } } return false; } @Override public int hashCode() { return s.hashCode(); } @Override public String toString() { return s; } } class Value { String s; Value(String s) { this.s = new String(s); } @Override public String toString() { return s; } } public class Main { public static void main(String[] args) { HashMap<String, String> a = new HashMap<>(); String usr = "weidiao", password = "20124003"; a.put(usr, password); usr = "haha"; System.out.println(a.get(usr)); password = "haha"; System.out.println(a.get("weidiao")); HashMap<Key, Value> b = new HashMap<>(); Key k = new Key("weidiao"); Value v = new Value("20124003"); b.put(k, v); k.s = "haha"; for (Key i : b.keySet()) { System.out.println(i + " : " + b.get(i)); } } } 输出为: null 20124003 haha : null
在这个问题中,改变了Key的值,就再也找不到“20124003”了,因为没有“weidiao”这个key了已经。而根据新key “haha”定位到的value为null。
如果为String类型,那就是深复制,就相当于复制了完完全全的一份,就相当于C++中的结构体复制。
如果为其他引用类型的数据,那就会浅复制,只复制了指针。
如果为基本数据类型,那就是深复制,String也是深复制。
如果为自定义类型,那就是浅复制。