Java中两个数交换的细节问题
来源:互联网 发布:网络百科全书是什么 编辑:程序博客网 时间:2024/06/05 05:58
在码代码过程中,两个数交换是经常用到的,但在Java 中,如果忽略了值传递和引用传递就很容易出错。
看一下两个整数交换代码:
public void swap(int a,int b){
int t=a;
a=b;
b=t;
}
这是不能成功交换两个数的,就算是C、C++也不行,因为这是通过值传递的方式实现交换的
int x = 100;
int y = 1;
swap(x, y);
在程序执行此段代码后,你会发现,x还是100, y还是1。为什么呢?因为Java对方法参数的传递,是使用值调用(call by value)的。想想,如果我这样调用swap函数呢,swap(3, 4),这是莫名其妙的,有谁会要交换3和4这两个常数呢。
那没办法交换两个整数变量了吗?可以。把swap函数体替换掉swap函数的调用就可以了。如:
int x = 100;
int y = 1;
int t = x;
x = y;
y = t;
Java中其他的原生类型(primitive type)的情况,和int的一样。
void swap(int &a,int &b)//引用传递
{
int temp;
temp = a;
a = b;
b = temp;
}
{
int temp;
temp = *a;
*a = *b;
* b = temp;
}
那继续讨论java的函数调用吧。函数调用时,参数传递的方式主要有两种:
- 值传递
- 引用传递
Java使用的是值传递。值传递是把变量的值、常数或常量传递给参数。而引用传递,是把变量的所在内存中的地址传递给参数,参数通过地址找到变量的值。很明显,引用传递不能把常数传递给参数。值传递和引用传递还有一个很大的不同:对于像int这样的小类型变量来说,值传递没副作用,而引用传递有。也就是说,在函数调用的执行过程中,不能改变传递给参数的变量的值。
但对于普通类类型参数的传递方式的理解和原生类型有点不同。对于方法method(Object o)的调用method(x), 不是把对象x复制一份传递给参数o,而是把对象x的在内存中的首地址,也就是把对象x的引用拷贝给参数o。这样就能这样实现对象的交换函数了吗?
public void swap(Object o, Object p) {
Object t = o;
o = p;
p = t;
}
答案是:No。因为像下面这样的调用:
Object x = X;
Object y = Y;
swap(x, y);
在执行完上的代码后,x指向的还是原来的X对象,y指向的还是那个Y对象。
难道就不能通过方法调用实现交换这个功能吗?可以。有两种办法:
1、 可以交换数组等集合里的元素
public void swap(Object[] a, int i, int j) {
Object t = a[i] ;
a[i] = a[j];
a[j] = t;
}
2、用反射实现
用反射实现swap函数(略)
参考:http://www.java3z.com/cwbwebhome/article/article2/21034.html?id=1766
http://blog.csdn.net/ccf19881030/article/details/5857629
---EOF---
- Java中两个数交换的细节问题
- Java中交换两个数的各种方法
- Java中交换两个数的值 三个方法
- java中两个变量数的交换方式
- Java交换两个数
- C++中两个数的交换
- C#中交换两个数的值
- C#中交换两个数的值
- Java快速交换两个数的值
- java交换两个数的数值
- 有关Java中两个整数的交换问题
- 有关Java中两个整数的交换问题
- 两个数的交换
- 两个数的交换
- 两个数的交换
- 两个数的交换
- java两个数进行交换
- java交换两个数 & 细说"^交换"
- linux中怎样安装交叉编译器
- Python 学习入门(12)—— 文件
- VS2005编译链接错误小结
- JS中的phototype是JS中比较难理解的一个部分
- linux 学习资源网站
- Java中两个数交换的细节问题
- Python 学习入门(13)—— 正则表达式
- 认识GPU
- Linux内建命令和外部命令(整理)
- MFC对话框中的控件随着对话框大小变化而变化
- 编程之美2014初赛第二场 题目1 : 神奇的数列
- 黑马程序员 之 IO流 拷贝视频 Day03
- 扎克伯格:用户年轻化对Facebook来说不是问题
- Linux下cvs详细安装和配置