2013-08-29 2 views
1

Почему мы можем изменить hashMap, объявленный как пустой финал, но мы не можем изменить примитивный тип? , например , если я создать картуПустой финал с ссылочным типом

final Map<String, String> someMap; 

и инициализировать его в конструкторе, и до сих пор я могу поставить значения в этом. Но то же самое не относится к примитиву

final int a; 

Я не могу изменить значение a в этом случае. может кто-нибудь объяснить это?

+0

Это может быть интересно: http://stackoverflow.com/questions/154314/when-should-one-use-final – Qben

+0

Вы говорите, что не можете изменить 'a' в конструкторе? Потому что это должно быть разрешено. – Kayaman

ответ

3

final означает, что он не может быть изменен после инициализации. Вы просто объявляете переменную, но не инициализируете ее, поэтому она разрешена.

Так делают это справедливо

final Map<String, String> someMap; 
someMap = new HashMap<String, String>(); 

Но если вы попытаетесь присвоить другое значение, чтобы это опубликовать инициализации, то компилятор должен выдавать ошибку, что окончательная переменная уже intialized:

final Map<String, String> someMap; 
    someMap = new HashMap<String, String>(); 
    someMap = new TreeMap<String, String>(); //error here 

Примечание : Также значение put/remove в hashmap не меняет ссылку на конечную переменную.

+1

, но то же самое не допускается в случае примитивов? –

+0

примитивы - это типы данных, которые содержат значение, в то время как ссылки похожи на указатели, которые не сохраняют свои значения, а указывают на их значения и используются на/с объектами. Если вы понимаете эту часть, тогда вы поймете, почему вы можете сделать окончательную ссылку hashMap. –

1

Это просто ссылка на карту (т. Е. Переменную someMap), которая не может быть изменена. Сама карта может быть изменена. Вы можете, например, вставить значения. Но вы не можете назначить новую карту someMap.

1

При использовании последнего ключевого слова по переменным вы говорите, что переменная может быть определена только один раз. Другими словами, как только значение было присвоено переменной, оно не может быть переназначено.

Это дает очевидное поведение с примитивными типами, но менее очевидно с объектами. Важно отметить, что при вставке значений в карту экземпляр объекта остается прежним. Это важно помнить при передаче объектов методам и действительно важно при использовании методов get/set/clone, так как вы можете получить несколько ссылок на один и тот же объект, где изменение в одном месте (вставка записи на карту) может иметь неопределенные эффекты в других.

Если карта в вашем вопросе важна, вы можете использовать java.util.Collections.unmodifiableMap(m);, чтобы остановить людей, играющих с ней.

1

emphasized text * * Когда вы пишете:

final Map<String, String> someMap; 

это важно понимать, что someMap является ссылка, и вы объявляете ссылку, чтобы быть окончательным. Фактический объект не является неизменным, но ссылка есть. Следовательно, вы не можете изменить ссылку, т. Е. Вы не можете сделать:

someMap = anotherMap; 

позже.