首先我们来看看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世界中函数或者叫方法的入參都是通过值拷贝的方式进行传递:
- 原始类型(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)方法;
非数组中的元素交换。能够使用最原始的交换方法。能够实现交换;也能够使用上面提到的重定义类的方式、外部内联的方式,视情况而定
非数组中的元素交换。能够使用最原始的交换方法。能够实现交换;也能够使用上面提到的重定义类的方式、外部内联的方式,视情况而定
版权声明:本文博主原创文章,博客,未经同意不得转载。