zoukankan      html  css  js  c++  java
  • 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)方法;
    非数组中的元素交换。能够使用最原始的交换方法。能够实现交换;也能够使用上面提到的重定义类的方式外部内联的方式,视情况而定


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    bzoj1529: [POI2005]ska Piggy banks
    BZOJ 3065 带插入区间K小值
    【BZOJ做题记录】07.07~?
    【BZOJ2882】【字符串的最小表示】工艺
    【不能继续浪啦】BZ做题记录[7.01~7.06]
    第一次到zhzx到今天已经一周年了
    BestCoder Round #45
    BestCoder Round #41 记。
    BZOJ做题记录[0512~?]
    [BZOJ2809&1455&1367]解题报告|可并堆
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4882708.html
Copyright © 2011-2022 走看看