2011-07-27 33 views
8

Szybkie pytanie, które być może jest kulawy.Na mapie Java <Integer, Double []>, muszę umieścić Double [] po uzyskaniu i modyfikacji?

W poniższym kodzie:

Map<Integer, Double[]> dataMap = new Map<Integer, Double[]>(); 
dataMap.put(1, new Double[]{100,100}); 
Double[] dob = dataMap.get(1); 
dob[0] = 100; 
dob[1] = 200; 
dataMap.put(1, dob); 

Czy ostatni "dataMap.put" Instrukcja konieczne? lub czy dataMap.get (1) da odniesienie do tablicy, która zostanie następnie zmodyfikowana bezpośrednio w instrukcjach późniejszych.

Wiem, że w przypadku obiektów zmiennych (np. Mapa), Map.get() da mi odniesienie do pożądanego obiektu, jednak z tablicą podwójną (której typ elementu, np. Double, jest niezmienny) I nie jestem pewien, czy otrzymam odniesienie do tablicy na mapie.

Dzięki!

Odpowiedz

17

Nie, końcowe stwierdzenie nie jest konieczne - ponieważ mapa zawiera tylko odniesienia do tablic, o czym już wspomniałeś. Tablica jest obiektem zmiennym, mimo że nie jest to obiekt podobny do obiektu o metodzie setName(String) - tylko dlatego, że String jest niezmienny, a typem kontenera nie jest.

Zauważ, że jeśli to zrobisz, inny wątek może zobaczyć połowę zmiany (tj ustawienie pierwszego elementu do 100), nie widząc drugi element ustawiony na 200. Czy to jest w porządku? Jeśli nie, można myśleć o tworzeniu nowy tablicę zamiast:

Map<Integer, Double[]> dataMap = new HashMap<Integer, Double[]>(); 
dataMap.put(1, new Double[]{100,100}); 
// Other stuff... 

// Replace value in map with a reference to a different array. 
Double[] dob = new Double[] { 100, 200 }; 
dataMap.put(1, dob); 

Jest to przy założeniu, że używasz nici bezpieczny mapę na początek, oczywiście ...

+0

Dobra odpowiedź, dzięki za wielowątkową końcówkę. – obaqueiro

1

Sam w sobie jest niezmienny, ale nie ma to znaczenia w odniesieniu do macierzy.

Pomyśl o każdym Double jako niezniszczalnym pudełku. Mimo że pudełka są niezniszczalne, nadal możesz je wyrzucić i zastąpić czymś innym, jeśli chodzi o twój ekwipunek.

Powiązane problemy