关于前段时间JAVA编程两件糗事

由于不直接编码有了一段时间,加上年纪加大,生活琐事增多,记忆力也慢慢更加弱化了。真希望大脑的记忆块像个大硬盘。哈


一)关于HashMap 中一个API的用法,之前的写法

        if (!hashMap.containsKey(userId)) {// 第一次加载进来
                Credit credit = new Credit(userId);
                return hashMap.put(userId, credit);---------(1
            }

       return  hashMap.get(userId);--------------------------(2

本意是想加载进去取出,1处这个地方搞错了,犯了想当然的错误,经查API 表述 :
the previous value associated with key, or null if there was no mapping forkey. (Anull return can also indicate that the map previously associatednull withkey, if the implementation supportsnull values.)

修正后的代码调整为:去掉 1) 处的return。

    if (!hashMap.containsKey(userId)) {// 第一次加载进来
                Credit credit = new Credit(userId);
                hashMap.put(userId, credit);---------(1
            }      

     return  hashMap.get(userId);-------------------(2

记得之前自己这个地方也曾多次写过正确的代码,为什么这次反而写错了呢?真的如同小学时老师的教导:三天不念口生,三天不写手生。

如果说这个算是生了导致的,那下面这个应该是一般原理性的内容,应该是理解了就不应该再犯的错误。


二)关于方法形参传递(引用型参数)

代码片段:

A段:

List<FrzServDto> frzDtolist = null;

....................其他处理................

if (frzDtolist == null)
                processDto(frzDtolist);//------------------------------------------------------(1此处 参数 frzDtolist

....................其他处理.................

frzDtolist == null ? true : false;//你认为这个地方应该是true or false?


B段:

public static void processDto(List<FrzServDto>  frzDtolist) {//-------------------(2 此处参数(形参) frzDtolist

        frzDtolist = new ArrayList<FrzServDto>();

        frzDtolist.add(frzServDto.buildUnfrzServDto(frzmny, all, err));

}

----------------------------------------------------------------------------------------------------------------------

刚才说了,主要的是基本原理,什么基本原理呢,那就是对JAVA编程中形式参数的理解,这个是基础啊。

1处的参数,和 2处参数,虽然名字相同,但是本身两个不同地址空间,以及作用域范围。


============================下面内容来自网络==============================
形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。

2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。

4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

三)java是传值还是传引用

写到这里,可能很多朋友已经发晕了,同时也看到网络上很多争论,http://www.360doc.com/content/05/1226/21/3383_50052.shtml 很详细说明了问题。

里面主要内容观点是:

一)参数类型是简单类型的时候,是按值传递的。以参数形式传递简单类型的变量时,实际上是将参数的值作了一个拷贝传进方法函数的,那么在方法函数里再怎么改变其值,其结果都是只改变了拷贝的(形参)值,而不是源值(实参)。--------所谓值传递

二)引用是一种数据类型,保存了对象在内存中的地址,这种类型即不是我们平时所说的简单数据类型也不是类实例(对象);

    不同的引用可能指向同一个对象,换句话说,一个对象可以有多个引用,即该类类型的变量。

三)结果,就像光到底是波还是粒子的问题一样,Java 方法的参数(形参)是按什么传递的问题,其答案就只能是:即是按值传递也是按引用传递,只是参照物不同,结果也就不同。

Java 中,改变参数的值有两种情况

第一种,使用赋值号“=”直接进行赋值使其改变

第二种,对于某些对象的引用,通过一定途径对其成员数据进行改变

对于第一种情况,其改变不会影响到方法该方法以外的数据,或者直接说源数据。

而第二种方法,则相反,会影响到源数据——因为引用指示的对象没有变,对其成员数据进行改变则实质上是改变的该对象。


如果到此你还是对调用感到迷惑,再推荐一篇 http://dreamhead.blogbus.com/logs/2005/05/1189478.html

其核心说明

参数传递的秘密
知道方法参数如何传递吗?
记得刚开始学编程那会儿,老师教导,所谓参数,有形式参数和实际参数之分,参数列表中写的那些东西都叫形式参数,在实际调用的时候,它们会被实际参数所替代。
编译程序不可能知道每次调用的实际参数都是什么,于是写编译器的高手就出个办法,让实际参数按照一定顺序放到一个大家都可以找得到的地方,以此作为方法调用的一种约定。所谓“没有规矩,不成方圆”,有了这个规矩,大家协作起来就容易多了。这个公共数据区,现在编译器的选择通常是“栈”,而所谓的顺序就是形式参数声明的顺序。
显然,程序运行的过程中,作为实际参数的变量可能遍布于内存的各个位置,而并不一定要老老实实的呆在栈里。为了守“规矩”,程序只好将变量复制一份到栈中,也就是通常所说的将参数压入栈中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值