Java中两个数交换的细节问题

2023-05-16

在码代码过程中,两个数交换是经常用到的,但在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的一样。


而在C或C++中,是通过引用和指针来进行交换的:
void swap(int &a,int &b)//引用传递 
{
  int temp;
 temp = a;
  a = b;
  b = temp;
}
void swap(int *a,int *b)//指针,地址传递 
{
 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---



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中两个数交换的细节问题 的相关文章

随机推荐

  • 数据库mysql 主从方案

    双机热备的概念简单说一下 xff0c 就是要保持两个数据库的状态自动同步 对任何一个数据库的操作都自动应用到另外一个数据库 xff0c 始终保持两个数据库数据一致 这样做的好处多 1 可以做灾备 xff0c 其中一个坏了可以切换到另一个 2
  • shell工具--sed和awk详解

    grep grep是一款强大的文本过滤工具 xff0c 按照关键字或者正则表达式进行过滤 具体讲解请看博文 这里写链接内容 sed sed是一种流编辑器 xff0c 它是文本处理中非常中的工具 xff0c 能够完美的配合正则表达式使用 1
  • js实现打字机效果---Day06

    我常想象这样一幅画面 xff1a 素雅的大背景 xff0c 伴着可心的音乐 xff0c 优雅旋转着的芭蕾舞者 xff0c 旁边那不断打出的文字 xff0c 仿佛就这样娓娓道来他们那美美的故事 xff1b 也常想象 xff1a 呼喇啦甩动的大
  • 纯css3实现漂亮的对话框----Day07

    姑且先不来讨论css3跟css的区别 xff0c 也不说html和html5的不同 xff0c 虽然这很关键 xff0c 但是现阶段还真的没整利落了 xff0c 姑且就这些应用先用着 xff0c 等自己有些见解了再来探讨那些深层次的问题 先
  • 纯css3实现饼状图-------Day21

    现代网站在商务应用中比较广泛 xff0c 什么oa xff0c 什么erp xff0c 除了导入导出 xff0c 就是数据统计 xff0c 再不然就来个做个报表 xff0c 而饼状图作为数据的一种直观统计显示 xff0c 应用是非常广泛的
  • 你是如何理解var e=e||window.event的------Day26

    你是如何理解var e 61 e window event的 xff1f 相信很多人都能给我个回答说是 xff1a 为了实现多种浏览器兼容 不错 xff0c 确实是为了实现浏览器兼容 xff0c 但是它又是如何实现浏览器兼容的呢 xff1f
  • js实现回放拖拽轨迹-------Day48

    今天有点小高兴 xff0c csdn博客浏览量过万了 xff0c 在过去还从来没有过这么高的浏览量呢 xff0c 不得不说 xff0c 太多时候还是有些矫情 xff0c 可看到这些鼓励还是忍不住高兴啊 xff0c 至少 xff0c 这样让我
  • js实现动态删除表格的行或者列-------Day57

    昨天记录了动态添加表格的一行 xff0c 当然这个一行是指一行数据 xff0c 也就是说一行多少列也是加上的 xff0c 并且第几列的内容都可以添加上 xff0c 先来回顾下它的实现的关键点 xff1a 1 var row 61 table
  • js实现表格的选中一行-------Day58

    最开始想更多的用js来动态操作表格 xff0c 是因为在应用了easyUI之后 xff0c 发现直接写一个 lt table id 61 34 tt 34 gt lt table gt xff0c 这就够了 xff0c 界面里面就剩下这么一
  • 积跬步,聚小流-------关于UML时序图

    uml时序图的存在 在上一篇中记录了uml类图 xff0c 用类图来描述代码中所需要的类以及相互之间的关系 xff0c 也就立体的将整个程序框架展现在了我们面前 xff0c 像一幅画 xff0c 有山有水有人 一张照片只能定格当时的美好 x
  • 积跬步,聚小流------用smartpaginator来做分页

    网络上的实例 xff08 jquery smarypaginator 例图 xff09 如果说是从 百度 上搜索过 jquery分页插件 的朋友 xff0c 相信对上面的图片不会陌生 xff0c 几乎所有介绍 jquery分页插件 的文章中
  • 我的2017-搭建个人网站,搭建PHP环境(2)

    上周确定了 xff0c 想要应用的后台语言 xff0c 面临的最大问题就是 xff1a php我不会啊 xff0c 哈哈哈哈 xff0c 所以接下来首先要做的就是了解 学习php的相关知识 接下来的第一步 xff1a 环境搭建 1 下载安装
  • 设计一个类:只能在堆上创建对象?只能在栈上创建对象?只能创建一个对象?

    在C 43 43 中 xff0c 类的对象建立分为两种 xff0c 一种是静态建立 xff0c 如A a xff1b 另一种是动态建立 xff0c 如A ptr 61 new A xff1b 这两种方式是有区别的 静态建立一个类对象 xff
  • 我的2017-搭建个人网站,hello PHP(2)

    学习一门语言 xff0c 例行惯例 xff0c 先来个 hello world 搭建好了php环境 xff0c 然后就可以运行php了 xff0c 首先用一种最简单的方法 xff0c 在wamp安装位置 xff08 相应的文件夹 xff09
  • 我的2017-搭建个人网站,自拟定代码根目录

    wampserver集成安装环境安装的php的运行根目录在wamp文件夹中的www文件夹下 xff0c 而为了有效的将代码和服务器进行分离 xff0c 可以采用自拟定代码根目录进行修改 1 确定代码编辑位置 xff0c 修改服务器默认指向
  • 编译原理:求First集与Follow集的方法

    明天就要考试了 xff0c 发现一直理解错了First集与Follow集的解法 xff0c 贴上比较好理解的 文法 xff1a S ABc A a B b First集合求法 能 由非终结符号推出的所有的开头符号或可能的 xff0c 但要求
  • 位运算n & (n-1)的妙用

    本文转自 xff1a http blog csdn net zheng0518 article details 8882394 按位与的知识 n amp n 1 作用 xff1a 将n的二进制表示中的最低位为1的改为0 xff0c 先看一个
  • 二分查找算法(Java版)

    二分查找算法是非常经典且基本的算法 1 二分查找又称折半查找 xff0c 优点是比较次数少 xff0c 查找速度快 xff0c 平均性能好 xff1b 其缺点是要求待查表为有序表 xff0c 且插入删除困难 因此 xff0c 折半查找方法适
  • 电脑眼睛保护色——绿豆沙色

    眼科医生建议电脑屏幕不要用白色 xff0c 因为白色对眼睛的刺激是最大的 xff0c 最损伤视力 xff01 眼科医生推荐的颜色是 柔和的淡绿色 xff0c 也有人叫做绿豆沙色 按HSU 设置为 xff1a 色度 HUE xff1a 85
  • Java中两个数交换的细节问题

    在码代码过程中 xff0c 两个数交换是经常用到的 xff0c 但在Java 中 xff0c 如果忽略了值传递和引用传递就很容易出错 看一下两个整数交换代码 xff1a public void swap int a int b int t