关闭

C/C++和Java达到swap不同功能

发表于:2015-10-16 10:07

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:mengfanrong    来源:51Testing软件测试网采编

  首先我们来看看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)方法;
  非数组中的元素交换。能够使用最原始的交换方法。能够实现交换;也能够使用上面提到的重定义类的方式、外部内联的方式,视情况而定
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号