日期:2014-05-17  浏览次数:20665 次

两个MAP MAP1=MAP2 map1是map2的引用吗?请教疑惑
sql="select * from goods;
List goods=MySql.executeQueryList(sql);返回的LIST LIST添加的都是map
Map map=(Map)goods.get(0);
Set<Map.Entry>set=map.entrySet();
for(Map.Entry entry:set)
{
  if(entry.getKey().equals("detail"))//detail的意思代表商品详情
  {
  entry.setValue(hr.restoreHtmlEscape((String)entry.getValue()));//还原HTML格式 比如:<> "" '因为入数据库时是转义过HTML字符的
  }
}
request.setAttribute("goods", goods);
/////////////////////////////////////////
无意中点了一下JSP页面浏览了
在JSP页面显示时 detail里面的内容被转义好,疑惑难道Map map 是(map)goods.get(0)的引用? 改变map中的内容,List goods中的内容为什么也会改变疑惑?

求解??

------解决方案--------------------
没错Map map 就是 (map)goods.get(0)的引用

改map 就等于改 goods.get(0)
------解决方案--------------------
map和 goods.get(0)是同一块地址。 所以改map就是改(map)goods.get(0)。

------解决方案--------------------
楼主先把变量、对象,两个概念区分清楚。

对象代表真实的数据与函数的实体,变量仅仅是存放该实体的引用(这里暂不考虑基础数据类型的变量)。

但是因为Java中没有地址概念,所以程序中是无法直接去访问一个对象的,这就意味着必须经由某变量直接或间接的定位访问到某对象。

List goods=MySql.executeQueryList(sql); // 这里 goods 是一个变量,引用了MySql.executeQueryList() 函数所返回的某对象。

Map map=(Map)goods.get(0); // 这里map是一个变量,引用了 goods 所引用List对象的get()函数所返回的某对象,如果查看其源码的话,会知道该函数直接把对象的某成员数组的一个元素返回了,并没有做clone();那么也就意味着map变量 和 该List对象中的成员数组,引用的是同一个 Map对象。


刚开始接触还是比较容易混淆,建议找本书看看,加深理解。