可以在不创建任何其他类的情况下使用 java 中的包装类交换两个数字吗?

Can two numbers be swapped using wrapper class in java without creating any other class?

提问人:user8157045 提问时间:12/17/2018 最后编辑:user8157045 更新时间:12/17/2018 访问量:820

问:

这是我使用包装类交换两个数字的代码,我知道 java 只有传递值,所以我们不能使用指针之类的东西来传递变量的地址。为此,我为包装类 Integer a,b 创建了对象。 但是这段代码不起作用,代码部分的注释解释了我的方法,有人可以告诉我我哪里出了问题。

class swp{

public static void main(String[] args) {
Integer x = new Integer(5);  //x --> obj with 5 int value
Integer y = new Integer (6); //y --> obj with 6 int value


System.out.println("x = "+ x+ "   " +"y = " + y);
swap(x,y);
System.out.println("x = " + x+ "   " +"y = " + y);
}


//the values in x and y are copied in a and b 



static  void swap(Integer a,Integer b){         //a ,x--> obj with 5 int value .b,y --> obj with 6 int value
        int temp = a.intValue();              // temp contains 5
        a = b.intValue() ;                   // value at the obj ref. by a has changed to 6
        b = temp;                          //value at the obj ref. by a has changed to 5


        System.out.println("in func :  "+"a = " + a+ "   " +"b = " + b);       
}

}

输出

 a = 5   b = 6
 in func :  a = 6   b = 5
 a = 5   b = 6

我知道我可以使用以下方法做到这一点

void swap(class_name obj1,class_name obj2){
       int temp = obj1.x;
       obj1.x =obj2.x;
       obj2.x = temp;
}

但我想知道我的方法到底出了什么问题。

java 参数传递 引用 包装器

评论

1赞 Boris the Spider 12/17/2018
Java 按值传递引用。 是不可变的。所以不,你不能做你想做的事。但请注意,永远不要调用两件事,并且 的值被缓存,因此将始终是 的相同实例。Integernew IntegerInteger[-128, 128)Integer x = 5Integer
0赞 Silvio Mayolo 12/17/2018
您只是在移动本地指针。该函数实际上不执行任何操作。而且(据我所知)这个类是不可变的,所以你问的东西是不可能的,除非你编写自己的包装器。你为什么要这样做?swapjava.lang.Integer
0赞 user8157045 12/17/2018
好的,我明白了它与包装类 Integer 本身的不可操作性有关。所以请帮助我理解这一点,如果我错了,请告诉我.在“main”中,“x”和“y”仍然指向相同的位置,但是在“swap”函数中,我认为“a”和“b”指向的位置的值发生了变化,而不是“a”和“b”现在指向一个完全不同的位置,其值与“b.intvalue()”和“a.intvalue”相同

答:

2赞 Elliott Frisch 12/17/2018 #1

不能直接使用,但可以使用(或)数组。喜欢IntegerIntegerint

public static void main(String[] args) {
    int[] arr = { 5, 6 };
    System.out.println("a = " + arr[0] + "   " + "b = " + arr[1]);
    swap(arr);
    System.out.println("a = " + arr[0] + "   " + "b = " + arr[1]);
}

private static void swap(int[] arr) {
    int t = arr[0];
    arr[0] = arr[1];
    arr[1] = t;
}

哪个输出

a = 5   b = 6
a = 6   b = 5

或者创建一个 POJO,例如,

class MyPair {
    private int a;
    private int b;

    public MyPair(int a, int b) {
        this.a = a;
        this.b = b;
    }

    public String toString() {
        return String.format("a = %d, b = %d", a, b);
    }

    public void swap() {
        int t = a;
        a = b;
        b = t;
    }
}

然后你可以做

public static void main(String[] args) {
    MyPair p = new MyPair(5, 6);
    System.out.println(p);
    p.swap();
    System.out.println(p);
}

对于相同的结果。