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)方法;

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

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

时间: 2024-10-01 23:21:37

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对程序员屏蔽了变量地址的概念,减少指

JAVA UI 拖拽功能

java GUI拖拽功能是很实用也相对高级一些的功能. 有一小部分的GUI控件支持他们有dragEnabled属性.这些JComponent包括:javax.swing.JColorChooserjavax.swing.JFileChooserjavax.swing.JListjavax.swing.JTablejavax.swing.JTreejavax.swing.text.JTextComponent 大部分的控件不支持没有这个属性,尤其是常用的jpanel和jframe. 一种简单的方法

Java UDP实现聊天功能代码

我以前经常写的是基于TCP的网络编程,由于TCP建立连接鼻血要经过三次握手连接,服务器端需要阻塞式等待客户端的连接.而UDP则是可以直接向目的地址的目的端口上发送数据包,由于它只负责发送出去就好,不管对方是否正确接受到与否,所以当网络性能不好时它容易出现丢包的问题.(注意:UDP是基于数据报为单位进行传输的,而TCP是一种基于流进行传输的) 但是UDP很好的模拟了我们呢平时聊天的方式,可以很好的实现连续多次发送和接受,也就是简单的QQ聊天的功能. 现在来简要介绍Java中有关UDP编程相关的类:

Java基础:多功能小窗口,swing,io,net综合应用

概念原理的理解,不代表能熟练应用. 如果将多个知识点关联并应用起来,这能加快我们对知识的掌握. 作为一个初学者,最快速的上手方式应该就是学以致用了. 下面做了一个小窗口,主要是为了综合应用java的一些基础功能,界面稍显随意. 界面: 具体功能以及代码: 1 /*具体实现功能: 2 * 1.根据地址栏的路径打开文本文件,显示在文本区域. 3 * 2.根据地址栏的网址获取网页源代码,显示在文本区域. 4 * 3.通过打开按钮打开本地文本文件,显示在文本区域. 5 * 4.通过保存按钮,把文本区域内

java—servlet实现文件下载功能

最近在学javaweb技术,利用所学知识做了一个简单的项目,在服务器上实现给用户下载文件的功能.自动列出文件夹下的文件提供下载,支持中文文件名. 结果图 其中使用了tomcat来部署服务器,代码中应用了少许EL表达式和JSTL标签,使用了jsp和servlet,当然还有java和http的基础知识,但是个人觉得重点是http的Content-Disposition头信息和Content-type头信息在servlet中下载方面的应用,详见DownloadPageServlet.java源码. 关

Java中读取Excel功能实现_POI

这里使用apache的poi进行读取excel 1,新建javaproject 项目:TestExcel 2,导入包 包下载地址:http://poi.apache.org/download.html#POI-3.10-FINAL 百度网盘下载:http://pan.baidu.com/s/1i365mQT 导入根目录下.lib.ooxml-lib下的所有jar 4,操作读取excel import java.io.File; import java.io.IOException; import

Java中Excel导入功能实现、excel导入公共方法_POI -

这是一个思路希望能帮助到大家:如果大家有更好的解决方法希望分享出来 公司导入是这样做的 每个到导入的地方 @Override public List<DataImportMessage> materialDataImport2(byte[] fileBytes, String fileName) { //return DataImport(fileBytes, fileName, "inv_m"); File file = FileUtils.getFileFromByte

用JAVA写一个函数,功能如下: 任意给定一组数, 找出任意数相加之后的结果为35(任意设定)的情况

用JAVA写一个函数.功能如下:任意给定一组数,例如{12,60,-8,99,15,35,17,18},找出任意数相加之后的结果为35(任意设定)的情况. 可以递归算法来解: package test1; import java.util.Arrays; public class demo { public static void main(String[] args) { String str = "12,60,-8,99,15,35,17,18,8,10,11,12"; int s

实现java字符串长度截取功能

代码如下: /** * 字符串长度截取 * @author Administrator * */ public class Main { public static void main(String[] args) { String str = "java教程网提醒您,全屏观看效果更佳,更高清,该视频以学习为目的,不含任何商业模式,并且不提供任何的技术服务等,如有其它问题可以联系网站管理员,更多java源码尽在源码天堂."; int len = str.length(), maxLen