我有這段代碼。它應該按整數值排序地圖。爲什麼參考自動更新?
public class Main {
public static void main(String[] args) {
HashMap<String,Integer> map = new HashMap<>();
ValueComparator bvc = new ValueComparator(map);
TreeMap<String,Integer> sorted_map = new TreeMap<>(bvc);
map.put("A",5);
map.put("B",4);
map.put("C",4);
map.put("D",2);
System.out.println("unsorted map: "+map);
sorted_map.putAll(map);
System.out.println("results: "+sorted_map);
}
}
class ValueComparator implements Comparator<String> {
Map<String, Integer> base;
public ValueComparator(Map<String, Integer> base) {
this.base = base;
System.out.println("Map: " + base);
}
public int compare(String a, String b) {
if (base.get(a) >= base.get(b)) {
return -1;
} else {
return 1;
}
}
}
它工作正常。 但首先作爲ValueComparator實例的參數,我給構造函數一個空的hashmap。而這個空的地圖保存在基地。然後我用比較器創建樹圖。然後我把東西放在地圖上,它會自動更新ValueComparator中名爲的基準。爲什麼地圖會自動傳遞給ValueComparator更新?其實基地變量應該仍然是一個空的地圖。不是嗎?
沒有,Java是傳值 - 但* *基準是按值傳遞。通過引用的方式來調用它會讓那些理解真實通過引用的人感到困惑。 –
情況總是如此嗎?所以我可以將字符串傳遞給構造函數,然後更改字符串,然後在構造類中輸出字符串的方法。它會是新的字符串嗎? – MinecraftShamrock
@MinecraftShamrock字符串是不可變的。但是,如果您在方法中重新分配字符串,將其從調用方中返回,並返回sys.out,則您將擁有與調用方法之前相同的值。這就使得java非常清楚地傳遞了這個事實。 –