c/c++和java实现swap函数的不同处

首先我们来看一下在c/c++中实现的swap函数

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

那么在java中是否还能这样呢,很显然java中没有地址引用符号了。

首先我们来看下c/c++和java的区别。

本质区别

C/C++中swap功能的本质:通过传递变量地址(指针或引用)来交换变量地址中的值。

Java标榜其中对C/C++一个很大的改进就是:Java对程序员屏蔽了变量地址的概念,减少指针误用。

在Java世界中函数或者叫方法的入参都是通过值拷贝的方式进行传递:

  • 原始类型(char,int,double等)都是通过直接拷贝变量值传参;
  • 对象类型都是通过引用拷贝(跟C++中引用不同)传参,通过该引用能够更改其指向的对象内部值,但是更改该引用值,仅对函数内部可见,函数外部的实参依然没有改变;

从上面可以看出通过地址的方式在java中是不可能实现的,因为java严格遵循值传递(pass-by-value)。

java传递是引用的拷贝,既不是引用本身,更不是对象。

但没有解决不了的问题,我们可以利用其他方法来实现:

Method1:用数组交换值(对于数组中的元素的交换,所以经常在排序中看到)

Public  static  void  swap ( int [] Data,  int  a,  int  b) {
        int  t = Data [a];
        data [a] = data [b];
        data [b] = t;
}

Method2:用重定义类(自己定义的)

Class  MyInteger {
    Private  int  x;     / / the x as the only data member
    Public  MyInteger ( int  xIn) {x = xIn;}  / / Constructor
    Public  int  getValue () {  return  x;}   / / get the value
    Public  void  insertValue ( int  xIn) {x = xIn;}  / / change the value of the
}    

Public  Class  Swapping {
    / / Swap: pass object references
    static  void  swap (MyInteger rWrap, MyInteger sWrap) {
        / / Change the value of the process
        int  t = rWrap.getValue ();
        rWrap.insertValue (sWrap.getValue ());
        sWrap.insertValue (t);
    }
    Public  static  void  main (String [] args) {
        int  a =  23 , b =  47 ;
        System.out.println ( "Before. a:"  + a +  ", b:"  + b);
        MyInteger AWRAP =  new  MyInteger (a);
        MyInteger bWrap =  new  MyInteger (b);
        swap (aWrap, bWrap);
        a = aWrap.getValue ();
        b = bWrap.getValue ();
        System.out.println ( "After. a:"  + a +  ", b:"  + b);
    }
}

Method3:外部内联法

Public  Class  Swap2 {
    Public  static  void  main (String args []) {
        Swap2 SW =  new  Swap2 ( 1 , 2 );
        System.out.println ( "i is"  + sw.i);
        System.out.println ( "J is"  + sw.j);
        sw.swap ();
        System.out.println ( "i is"  + sw.i);
        System.out.println ( "J is"  + sw.j);
    }
    int  i, J;
    Public  Swap2 ( int  i,  int  J) {
        this . i = i;
        this . J = J;
    }     

    Public   void  swap () {
        int  Temp;
        temp = i;
        i = j;
        j = temp;
    }
}     

Public  Class  swap1 {
    Public  static  void  swap1 (Integer a, Integer b) {
        Integer temp = a;
        a = b;
        b = temp;
    }
    Public   static   void  main (String args []) {
        Integer a, b;
        a =  new  Integer ( 10 );
        b =  new  Integer ( 20 );
        Swap1.Swap1 (a, b);
        System.out.println ( "a is"  + a);
        System.out.println ( "b is"  + b);
    }
}

总结:

数组中的元素交换,可以使用下文中的public static void swap(int[] data, int a, int b)方法;

非数组中的元素交换,可以使用最原始的交换方法,可以实现交换;也可以使用上面提到的重定义类的方式、外部内联的方式,视情况而定

c/c++和java实现swap函数的不同处,布布扣,bubuko.com

时间: 2024-10-10 07:37:40

c/c++和java实现swap函数的不同处的相关文章

c/c++和java达到swap不同功能

首先我们来看看c/c++实施swap性能 void swap ( int & a, int & b) { int Temp; temp = a; a = b; b = temp; } 那么在java中是否还能这样呢.非常显然java中没有地址引用符号了. 首先我们来看下c/c++和java的差别. 本质差别 C/C++中swap功能的本质:通过传递变量地址(指针或引用)来交换变量地址中的值. Java标榜当中对C/C++一个非常大的改进就是:Java对程序猿屏蔽了变量地址的概念,降低指针误

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

swap函数的例子

13.31为你的HasPtr类定义一个<运算符,并定义一个HasPtr的vector为这个vector添加一些元素,并对它执行sort.注意何时会调用swap. #include<iostream> #include<string> #include<new> #include<vector> #include<algorithm> using namespace std; class HasPtr { friend void swap(H

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

条款25:考虑写出一个不抛异常的swap函数

条款25:考虑写出一个不抛异常的swap函数 swap函数在C++中是一个非常重要的函数,但实现也非常复杂. 看一个缺省的std::swap函数的实现 namespace std { template<typename T> void swap( T& a , T& b) { T temp(a); a = b; b = temp } } ①内置类型的调用 int a = 2; int b =3; std::swap(a, b); cout<<"a:&quo

不使用java内置函数,将String字符串转换为int类型

package com.test; public class AtoiTest { public static void main(String[] args) throws Exception { String s = "-011134"; System.out.println("转换前的字符串:" + s); System.out.println("atoi1转换后的字符串:" + atoi1(s)); System.out.println(

作业二、comp和swap函数

一.swap函数的代码及运行情况 1.代码 1 #include<stdio.h> 2 int main() 3 { 4 void swap(int *m,int *n); 5 int a,b; 6 int *p1,*p2; 7 scanf("%d,%d",&a,&b); 8 p1=&a; 9 p2=&b; 10 swap(p1,p2); 11 printf("%d,%d\n",*p1,*p2); 12 return 0;

关于swap函数传值的问题

#include <stdio.h> void swap(int * p3,int * p4); int main() {  int a = 9;  int b = 8;  int * p1 = &a;  int * p2 = &b;    printf("%x %x\n",p1,p2);  swap(p1,p2);    printf("%d %d\n",a,b);  printf("%d %d\n",*p1,*p2

Android使用JNI(从java调用本地函数)

当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本地函数. 在Java端,开发者所需要做的仅仅是在连接本地函数的方法之前加上native关键字.这样VM就会去寻找这个本地函数. 1.从Java调用本地函数 从Java调用本地函数时,需要在类中定义一个带有native关键字的特有方法,作为连接本地代码的桥梁.通过这个定义,尝试调用本地方法时JVM会找