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

本文通过两个具体示例探讨了Java中Map对象及基本类型int作为参数时的传递特性。第一个例子展示了Map作为参数时实际上传递的是引用,而非期望的值;第二个例子则解释了为何基本类型的值在方法调用后未能如预期般改变。

关于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,传值和传引用能够很好地解释这两个问题




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值