이 코드가 있습니다. 정수 값으로 맵을 정렬해야합니다.참조가 자동으로 업데이트되는 이유는 무엇입니까?
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 인스턴스의 매개 변수로 빈 생성자에 빈 해시 맵을 지정합니다. 그리고이 빈지도는 베이스에 저장됩니다. 그런 다음 비교기로 트리 맵을 만듭니다. 그런 다음 물건을지도에 넣고 ValueComparator의 참조를 이라는 참조를 자동으로 업데이트합니다. ValueComparator에 전달 된지도가 자동으로 업데이트되는 이유는 무엇입니까? 사실 베이스 변수는 여전히 빈지도 여야합니다. 그렇지 않니?
아니요, Java는 값으로 전달되지만 * 참조는 값으로 전달됩니다. 참조로 전달하는 것은 참된 통과를 참조로 이해하는 사람들에게 혼동을줍니다. –
항상 그렇습니까? 그래서 문자열을 생성자에 전달한 다음 문자열을 변경 한 다음 문자열을 출력하는 생성 된 클래스에서 일부 메서드를 호출 할 수 있습니다. 새로운 문자열일까요? – MinecraftShamrock
@MinecraftShamrock String은 변경할 수 없습니다. 그러나 메서드에서 문자열을 재 할당하고 호출자에서 sys.out을 반환하면 메서드를 호출하기 전과 동일한 값을 갖게됩니다. 그렇다면 자바가 값으로 전달된다는 사실을 알 수 있습니다. –