Java中交换两个变量数据的感想

最近在学C++,由于大学的时候没有好好读书,所以学C++的时候感觉把记忆中很混淆的概念梳理了一下,再对比着自己现在工作用的Java,发现二者有很多相似和不同的地方,自己也不是一个爱写博客的人, 所以也就想到什么写点什么吧

一、C++ 和 Java 共通的交换方法

这里只介绍交换数据的方法,这个在C++ 和 Java 中操作的逻辑都是一样的,无外乎最常见的三种,使用中间变量,使用加法减法操作,使用位运算符,这里以C++的写法为主

1. 使用中间变量
void swap(int &a, int &b)
{
	int temp;
	temp = a;
	a = b;
	b = temp
}

这种很通俗易懂,没什么可说的

2. 使用加减法
void swap(int &a, int &b)
{
	a = a + b;	// 把a和b的元素和赋给a
	b = a - b;	// a现在是两数和,减去b就是a,再赋给b,所以现在b是a的值
	a = a - b;	// a依然是两数和,b的值是a的值,两数和减去a的值还剩b的值,再把b的值赋给a
}
// 这样就完成了交换,好处是不用使用额外变量,缺点是如果数据太大会溢出

3. 使用位运算符

void swap(int &a, int &b)
{
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
}

这种写法就很抖机灵,不建议使用,因为如果两数相同,则会把数据都置零,实质就是两个数异或两次变成了对面的数,优点是非常的快,如果要用可以加一个判断,就很完美了

二、C++ 中交换两个变量的值

如果是使用函数封装交换变量数据的方法,C++和Java的操作还是不一样的,在C++中很好实现,直接使用指针或者引用的方式就可以取到数据地址,对数据进行操作

void swap(int* p1, int* p2) { // do something...}

void swap2(int &a, int &b) { // do something...}

而在Java中,则不可以直接对地址进行操作,所以Java中的参数列表如果像这样,则无法完成交换

public static void swap(int a, int b) { // do something... }

调用这个函数只能在这个函数中完成交换,无法改变原先函数中的值。平常我们在写排序算法得时候,使用函数之所以能完成交换,是因为大部分情况下传入得参数列表是两个数组元素,而在Java中数组元素是按址传递的,因此可以交换成功,像这样

public static void swap(int[] arr, int i, int j) { // do something... }

那么问题来了,如果在Java中传入的参数不是数组,而是需要直接交换两个变量怎么办?这里就可以采用对象的方式进行操作,即把对象放类里面

public class test {

    public static class NumberClass {
        private int a = 10;
        private int b = 20;
    }


    public static void main(String[] args) {
        NumberClass nc = new NumberClass();
        swap(nc);
        System.out.println("主函数中");
        System.out.println("a = " + nc.a + ", b = " + nc.b);
    }

    public static void swap(NumberClass nc) {
        int temp;
        temp = nc.a;
        nc.a = nc.b;
        nc.b = temp;
        System.out.println("swap函数中");
        System.out.println("a = " + nc.a + ", b = " + nc.b);
    }

}

采取传入对象的方式即可,因为数组,对象都是按址传递的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值