有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java传递值交换方法

我试图在下面跟踪这个预先编写的代码

我无法理解下面的java交换方法如何适用于向量对象。我希望下面代码的输出是(我的向量:)[6]、[3]、[1](你的向量:)[5]、[1]、[6]。。。。但实际上是(我的向量:)[5],[1],[6](你的向量:)[6],[3],[1],[5],[1],[6]

谁能给我解释一下吗?我试图跟踪这段代码,我想我不理解java的“传递值”部分

提前谢谢

public static void swapContents(Vector v1, Vector v2){
    Vector temp = v1;
    v1 = new Vector();
    for(int i = 0; i<v2.size(); i++)
        v1.add(v2.get(i));
    for(int j = 0; j< temp.size(); j++)
        v2.add(temp.get(j));
}


public static void main(String[] args){

   Vector myVector = new Vector();
   myVector.add(new Integer(5));
   myVector.add(new Integer(1));
   myVector.add(new Integer(6));

   Vector yourVector = new Vector();
   yourVector.add(new Integer(6));
   yourVector.add(new Integer(3));
   yourVector.add(new Integer(1));

   swapContents(myVector, yourVector);

   System.out.println(myVector);
   System.out.println(yourVector);
 }

共 (5) 个答案

  1. # 1 楼答案

    在Java中,通过值传递对象引用。这意味着您对对象所做的任何更改都将反映在传入的对象中,例如在本例中:

    myVector.add(v2.get(i))
    

    这将更改传入的对象myVector。但是,对引用所做的任何更改都不会影响调用对象。像这样的

    myVector = new Vector();
    

    不会修改原件

    所以你的代码的作用是

    //Creates a new reference to the object passed in, v1
    Vector temp = v1;
    //Sets the reference v1 to point to a new object, which will not affect the originals
    v1 = new Vector();
    for(int i = 0; i<v2.size(); i++)
        //adds the contents of v2 into the new object
        //This has no impact on the original objects
        v1.add(v2.get(i));
    for(int j = 0; j< temp.size(); j++)
        //adds the contents of what was passed in as v1 into v2
        v2.add(temp.get(j));
    

    最后,所有这些都是在v2的后面加上v1。v1保持不变。 下面是a link,提供了有关Java变量传递规则的更多信息

  2. # 2 楼答案

    你有

    public static void swapContents(Vector v1, Vector v2){
        Vector temp = v1;
        v1 = new Vector();
        for(int i = 0; i<v2.size(); i++)
            v1.add(v2.get(i));
        for(int j = 0; j< temp.size(); j++)
            v2.add(temp.get(j));
    }
    
    • 首先保存v1
    • 然后你做一个新的v1
    • 然后从v2向其添加内容
    • 然后将v1内容添加到v2中(但v2仍保留其原始内容…)
  3. # 3 楼答案

    您所做的是将temp作为v1值的引用。然后取v1,并将其分配给一个新的空向量(这将应用于主方法中的向量)。接下来用向量2的值(6,3,1)填充它。v1现在完成了

    现在v2保持不变,仍然包含(6,3,1)。您可以添加temp的值(仍然指向v1(5,1,6)的旧值),并将它们放在v2的当前值之上

  4. # 4 楼答案

    swapContents方法内部移动引用是行不通的。像这样的东西会:

    public static void swapContents(Vector v1, Vector v2){
        Vector tmp1 = new Vector(v1);
        Vector tmp2 = new Vector(v2);
        v1.clear();
        v2.clear();
        for(Object o : tmp1) {
          v2.add(o);
        }
        for(Object o : tmp2) {
          v1.add(o);
        }
    }
    

    我希望这有帮助

  5. # 5 楼答案

    在java中,对象是通过引用传递的

    Public static void swap(Vector v1,Vector v2) {
        Vector tmp = new Vector();
        for (object obj : v1) {
            tmp.add(obj);
        }
        v1.clear();
        for (object obj : v2) {
             v1.add(obj);
        }
        v2.clear();
        for (object obj : tmp) {
            v2.add(obj);
        }
    }