变量交换看似很简单,稍有基础的人见到这个问题可能马上就潇洒地给出了以下代码:
然而结果却是
讯享网
这可能是初学者未经仔细思考后给出的结果,如果你也犯了这样的错误,你可能需要仔细反思一下。导致这样结果的原因是形参的改变是没法作用于实参的,学习过C/C++的同学可能知道这种交换可以用指针的效果来实现,在Java中则可以通过引用来修改成员变量。代码如下:
结果是:

讯享网
java基础转向jsp
交换成功,这个交换就是将要交换的两个值赋值给引用对象的成员,然后交换这两个成员的引用即可。然而,有些刁钻的面试题可能不允许借助于临时变量。这时候,可以通过相加的方式来实现交换,代码如下:
这种“相加”方式可能不好理解,需要读者自己去仔细想一想,甚至可以背下来,这样下次提起“变量交换”这个话题就立马想起“相加”。但是这种方式交换变量还存在一个问题:数据的溢出。比如val.i =(0b0000000000);val.j=(0b0);结果是,这超过了int数据的最大值,发生溢出,其二进制表示为0b0,这实际是个负数(-),但是这个数据的二进制表示再与val.j相减之后得到的却是正数,这却是期望的结果。所以尽管发生了溢出,但巧合的是最后我们仍然得到了期望的结果。但是归根结底这种方式是不值得提倡的。最后有一种相对完美的方案:对变量做异或运算。
异或运算的一个特性是一个变量i异或另外一个变量j两次之后得到的结果仍然是i,即
对上面的代码进行修改:
这种方式不好理解,却是优于前两种方式的方案。这里需要仔细思考一下实现的过程,异或运算在其他方面也有很多的应用。如果在面试时候能提出这样的思路,相信面试官也会对你高看一眼的。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/6958.html