我有以下情况:
public class MapTest {
String name = "guru";
/**
* @param args
*/
public static void main(String[] args) {
MapTest mapTest = new MapTest();
Map map = new HashMap();
map.put("name", mapTest.name);
System.out.println(mapTest.name);
map.put("name", "raj");
System.out.println(mapTest.name);
}
}
输出是:
guru
guru
有什么方法可以将输出作为
guru
raj
即。我希望HashMap map
和成员变量name
同步。
感谢。
答案 0 :(得分:8)
你做不到。这不是Java的工作方式。当你写:
map.put("name", mapTest.name);
将当前值mapTest.name
放入地图中。在评估了参数之后,它是原始表达式的完全独立的。
如果你需要做喜欢这样的事情,你会有一些可变的包装类 - 你将包装器的引用添加到地图中,并且然后你可以改变包装器中的值,并且无论你如何到达包装器,你仍然会看到更改。
示例代码:
import java.util.*;
class StringWrapper {
private String value;
StringWrapper(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return value;
}
}
public class Test {
public static void main(String[] args) throws Exception {
Map<String, StringWrapper> map = new HashMap<String, StringWrapper>();
StringWrapper wrapper = new StringWrapper("Original");
map.put("foo", wrapper);
System.out.println(map.get("foo"));
wrapper.setValue("Changed");
System.out.println(map.get("foo"));
}
}
答案 1 :(得分:1)
Java地图只是不支持这样的东西。当你这样做
map.put("name", mapTest.name);
您在地图中引用mapTest.name
引用的对象。当你这样做
map.put("name", "raj");
您在地图中引用了新的String
对象。 mapTest.name
的引用不再出现在地图中。
出于好奇,你为什么不想只使用map.get("name")
?
答案 2 :(得分:1)
您似乎对地图的工作方式感到困惑。为了更好的主意,请尝试打印出地图。
map.put("name", mapTest.name);
System.out.println(map);
map.put("name", "raj");
System.out.println(map);
你会得到:
{ “名称”= “大师”}
{ “名称”= “拉吉”}
请注意mapTest.name ==“guru”,因为您永远不会修改它。
答案 3 :(得分:0)
如果您想要动态执行某些操作,则应使用函数/方法。
public class MapTest {
private final Map<String, String> map = new HashMap<String, String>();
public String name() {
return map.get("name");
}
public static void main(String[] args) {
MapTest mapTest = new MapTest();
mapTest.map.put("name", "guru");
System.out.println(mapTest.name());
mapTest.map.put("name", "raj");
System.out.println(mapTest.name());
}
}
打印
guru
raj