2 t18267174450 t18267174450 于 2016.04.14 18:43 提问

java 在方法中修改MAP的值结果原MAP的值也发生了变化

public class Switch4
{
//获取指定品种的主力合约和交易合约
private void getCorrectContract(Map contractMap)
{
Map correctContractMap = contractMap; //原主力交易合约用来判断是否换月
correctContractMap.put("main_contract","15451"); //我在这里改变了MAP的值
correctContractMap.put("trade_contract","15122");
}
private void updataDataBase()
{

Map corMap = new HashMap();
corMap.put("main_contract","dfdfdfdf");
corMap.put("trade_contract","ttggg");
getCorrectContract(corMap); //结果contractList中MAP的值也改变了

System.out.println("完成"+corMap.get("main_contract"));
}
public static void main(String[] args)
{
Switch4 sw = new Switch4();
sw.updataDataBase();
}
}

打印结果
完成15451

map都什么特别的

5个回答

chy6575
chy6575   2016.04.15 14:21
已采纳

public class Switch4
{
//获取指定品种的主力合约和交易合约
private void getCorrectContract(Map contractMap)
{

Map correctContractMap = contractMap; //原主力交易合约用来判断是否换月
这只是对contractMap的引用进行的复制, 在内存中还是指向同一块内存区域,你修改correctContractMap的 也相当于修改了同一个内存块

这里应该这样写
重新开辟一个内存空间,将原map整个进行深度的复制 这样2个map都是独立的个体
Map correctContractMap = new HashMap();
contractMap.putAll(contractMap);

correctContractMap.put("main_contract","15451"); //我在这里改变了MAP的值
correctContractMap.put("trade_contract","15122");
}
private void updataDataBase()
{
Map corMap = new HashMap();
corMap.put("main_contract","dfdfdfdf");
corMap.put("trade_contract","ttggg");
getCorrectContract(corMap); //结果contractList中MAP的值也改变了
System.out.println("完成"+corMap.get("main_contract"));
}
public static void main(String[] args)
{
Switch4 sw = new Switch4();
sw.updataDataBase();
}
}

caozhy
caozhy   Ds   Rxr 2016.04.15 01:04
 Map<String, String> correctContractMap = contractMap; 

这个不行,你用的还是之前的。你需要这么写

 Map<String, String> correctContractMap = new Map<String, String>();
for (Map.Entry<String> entry : contractMap.entrySet()) { 
    correctContractMap.put(entry.getKey(), entry.getValue()); 
}  
u013321534
u013321534   2016.04.15 14:08

java 对象是引用传递的,修改map值就是修改了这个map引用的对象的实际值。

t18267174450
t18267174450   2016.04.14 18:55

public class Switch4
{
//获取指定品种的主力合约和交易合约
private void getCorrectContract(Map contractMap)
{
Map correctContractMap = contractMap; //原主力交易合约用来判断是否换月
correctContractMap.put("main_contract","15451");
correctContractMap.put("trade_contract","15122");
}
private void updataDataBase()
{

Map corMap = new HashMap();
corMap.put("main_contract","dfdfdfdf");
corMap.put("trade_contract","ttggg");
getCorrectContract(corMap); //获取指定品种的主力合约和交易合约
System.out.println("完成"+corMap.get("main_contract"));
}
public static void main(String[] args)
{
Switch4 sw = new Switch4();
sw.updataDataBase();
}
}

打印结果
完成15451

harrison2010
harrison2010   2016.04.14 21:12

1.要去明白java 参数传递到底是什么传递?
2.要明白java中对象存储方式与变量的关系

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!