java中的传值和传引用深刻体会

来源:互联网 发布:php 工作流 开源 编辑:程序博客网 时间:2024/06/09 17:14

关于Map的例子:

public void A(Map<Integer, String> myMap){    myMap = addMap(myMap, yourMap); //yourMap假设已经定义,并且其中有值    }

public static Map<String,Double> addWeight(Map<String,Double> goldMap,Map<String,Double> preMap)      {           Map<String,Double> addMap = new HashMap<String,Double>();                      for(String s : preMap.keySet())           {               if(goldMap.containsKey(s))               {                                  addMap.put(s, (goldMap.get(s) + preMap.get(s)));                                  } else               {                                 addMap.put(s, preMap.get(s));               }           }           for(String str : goldMap.keySet())           {               if(!preMap.containsKey(str))               {                  addMap.put(str, goldMap.get(str));                }           }                      //删除值为空的项             //集合类的都不能在循环的时候删除,因为删除元素后集合发生改变继而不能循环了           //这种删除方式以后不要再用了,严重出错           /*for(String key : cutMap.keySet())           {              Double value = cutMap.get(key);              if(value == 0.0)              {                  cutMap.remove(key);              }          }*/                     Set mapset = addMap.entrySet();          Iterator iterator = mapset.iterator();                    while(iterator.hasNext())          {              Map.Entry mapEntry = (Map.Entry)iterator.next();                 Double value =(Double)mapEntry.getValue();                            if(value == 0.0)              {                  iterator.remove();              }             }                      return addMap;      } 

方法A的目的是将addMap方法操作后向addMap中填充值,但是结果返回的myMap为空,百思不得其解,询问大牛后才明白,
解释:程序运行时myMap的id=97,进入addWeight方式调试,新创建的addMap的id = 91;
运行完addWeight方法后,A方法的中语句等号左边的myMap的Id = 91, 所以调用A方法的方法B在运行了A方法后myMap为空,因为B方法中的myMap的Id = 97,
总的来说A方法操作的不是传入的myMap了,而是addWeight中的addMap了


第二个问题: 基本类型int作为参数

public void getPredictTrigTypeNum(Segment predictSeg, OutputInfo goldAnswer, String specialTrigType int predictBdTypeNum){       for(int x = 0; x < goldAnswer.goldStructure.size(); x++)       {      Segment goldSeg = goldAnswer.goldStructure.get(x);      int goldSegStart = goldSeg.segmentStart;      int goldSegEnd = goldSeg.segmentEnd;      if(predictSeg.goldSegment.equals(goldSeg.goldSegment) && predictSeg.segmentStart == goldSegStart && predictSeg.segmentEnd == goldSegEnd)      {    if(specialTrigType.equals(goldSeg.segmentType))    {  predictBdTypeNum += 1;//边界正确类型正确中 A  break;     }       }}}


public void A (){       getPredictTrigTypeNum(predictSeg, goldAnswer, specialTrigType,predictBdTypeNum);}

该方法中 getPredictTrigTypeNum 中的目的是更改参数predictBdTypeNum
方法A调用运行方法getPredictTrigTypeNum后,参数predictBdTypeNum满足条件后会增加1
但是运行后却没有变化,




针对问题1和问题2,传值和传引用能够很好地解释这两个问题




0 0
原创粉丝点击