java中的数据类型分为:
图片出自:Java四类八种数据类型
对于整数类型:byte,short,int,long
(1) 可以使用异或运算,来实现两个整数变量中的值。这样的好处是,不用引入多余的空间,也不会超出改类型(例如int)的表示范围。
(2)借助缓存变量,实现交换.
对于浮点类型,不能使用异或运算来交换,可以引入一个缓存变量来实现交换
例子:
package Ctojava;
public class SwapDouble
{
public static void main(String[] args)
{
byte aByte=1;
byte bByte=2;
System.out.println("aByte="+aByte+" bByte="+bByte);
aByte^=bByte;
bByte^=aByte;
aByte^=bByte;
System.out.println("aByte="+aByte+" bByte="+bByte);
System.out.println("---------------------------------");
short aShort=3;
short bShort=4;
System.out.println("aShort="+aShort+" bShort="+bShort);
aShort^=bShort;
bShort^=aShort;
aShort^=bShort;
System.out.println("aShort="+aShort+" bShort="+bShort);
System.out.println("---------------------------------");
int aInt=5;
int bInt=6;
System.out.println("aInt="+aInt+" bInt="+bInt);
aInt^=bInt;
bInt^=aInt;
aInt^=bInt;
System.out.println("aInt="+aInt+" bInt="+bInt);
System.out.println("---------------------------------");
long aLong=7;
long bLong=8;
System.out.println("aLong="+aLong+",bLong="+bLong);
aLong^=bLong;
bLong^=aLong;
aLong^=bLong;
System.out.println("aLong="+aLong+",bLong="+bLong);
float aFloat=1.23f;
float bFloat=4.56f;
// aFloat^=bFloat;
// The operator ^= is undefined for the argument type(s) float, float
double aDouble=1.23;
double bDouble=4.56;
// aDouble^=bDouble;
//The operator ^= is undefined for the argument type(s) double, double
}
}
结果:
aByte=1 bByte=2
aByte=2 bByte=1
---------------------------------
aShort=3 bShort=4
aShort=4 bShort=3
---------------------------------
aInt=5 bInt=6
aInt=6 bInt=5
---------------------------------
aLong=7,bLong=8
aLong=8,bLong=7
下面是方法中使用异或来交换两个变量的值。对应基本数据类型,及其包装类,java方法中 无法对其交换,基本数据类型实参到形参是是传值传递。对形参的操作与实际参数无关
对于引用数据类型,形参和实参都是对象的引用。对形参的操作也就是对实参的操作。
package Ctojava;
class MyInt2
{
int myint;
public MyInt2()
{
myint=0;
}
public MyInt2(int myint)
{
this.myint=myint;
}
}
public class FunctionParameter
{
public static void main(String[] args)
{
int a=10;
int b=20;
System.out.println("a in main="+a+" b in main="+b);
swap(a, b);
System.out.println("a in main="+a+" b in main="+b);
Integer x=new Integer(40);
Integer y=new Integer(50);
System.out.println("x in main="+x+" y in main="+y);
swap(x, y);
System.out.println("x in main="+x+" y in main="+y);
MyInt2 n=new MyInt2(13);
MyInt2 m=new MyInt2(67);
System.out.println(n.hashCode());
System.out.println("n in main="+n.myint+" m in main="+m.myint);
swap(n, m);
System.out.println("n in main="+n.myint+" m in main="+m.myint);
}
public static void swap(int a,int b)
{
a^=b;
b^=a;
a^=b;
//方法内对基本类型的修改不影响 方法外面的形式参数
System.out.println("a in fun1="+a+" b int fun1="+b);
}
public static void swap(Integer a,Integer b)//包装类会自动拆箱装箱,包装类参数还是 值传递
{
a^=b;
b^=a;
a^=b;
//方法内对包装类形式参数的操作不影响 方法外面的实际参数
System.out.println("a in fun2="+a+" b int fun2="+b);
}
//方法对引用类型的参数传递 是引用传递。形参是实参的引用,对形参的修改就是对实参的修改
public static void swap(MyInt2 myInt1,MyInt2 myInt2)
{
System.out.println(myInt1.hashCode());
myInt1.myint^=myInt2.myint;
myInt2.myint^=myInt1.myint;
myInt1.myint^=myInt2.myint;
System.out.println("myInt1 in fun3="+myInt1.myint+" myInt2 int fun3="+myInt2.myint);
}
}
结果:
a in main=10 b in main=20
a in fun1=20 b int fun1=10
a in main=10 b in main=20
x in main=40 y in main=50
a in fun2=50 b int fun2=40
x in main=40 y in main=50
366712642
n in main=13 m in main=67
366712642
myInt1 in fun3=67 myInt2 int fun3=13
n in main=67 m in main=13
总结:基本数据类型,形式参数与实际参数无关。
引用数据类型,对形式参数的操作就是对实际参数的操作。