为什么我们可以更改声明为空白的hashMap,但我们不能更改基本类型? 例如 如果我创建地图
final Map<String, String> someMap;
并在构造函数中初始化它,我仍然可以在其中放置值。但原始
的情况并非如此final int a;
在这种情况下,我无法更改a的值。有人可以解释一下吗?
答案 0 :(得分:3)
final
表示初始化后无法更改。你只是声明变量但没有初始化它,因此它是允许的。
这样做是有效的
final Map<String, String> someMap;
someMap = new HashMap<String, String>();
但是如果你尝试在初始化后为它分配另一个值,那么编译器应该抛出一个错误,即最终变量已经初始化:
final Map<String, String> someMap;
someMap = new HashMap<String, String>();
someMap = new TreeMap<String, String>(); //error here
注意:在hashmap中添加/删除值也不会更改最终变量的引用。
答案 1 :(得分:1)
它只是对地图的引用(即变量someMap
),它是无法改变的。地图本身可以更改。例如,您可以插入值。但您无法将新地图分配给someMap
。
答案 2 :(得分:1)
在变量上使用final关键字时,您说该变量只能定义一次。换句话说,一旦为变量赋值,就无法重新分配。
这会产生基本类型的明显行为,但对于对象则不那么明显。重要的是,当将值插入到地图中时,对象实例保持不变。在将对象传递给方法时要记住这一点非常重要,并且在使用get / set / clone方法时非常重要,因为最终可能会对同一个对象进行多次引用,其中一个位置的更改(在map中插入条目)可能未定义对他人的影响。
如果问题中的地图很重要,您可以使用java.util.Collections.unmodifiableMap(m);
来阻止人们摆弄它。
答案 3 :(得分:1)
* emphasized text
*当你写:
final Map<String, String> someMap;
重要的是要意识到someMap
是引用,并且您声明引用是最终的。实际对象不是不可变的,但引用是。因此,您无法更改参考,即您无法做到:
someMap = anotherMap;
稍后。