Java:对象分配

Java:对象分配,java,object,reference,Java,Object,Reference,我想在java中,当您执行object1=object2时,您会将object2的引用复制到object1,因此object1和object2指向同一个对象。对吗 我编写了一个函数对堆栈进行排序 import java.util.Stack; public class sortStack { public static void main(String[] str) { Stack<Integer> s = new Stack<Integer>

我想在java中,当您执行
object1=object2
时,您会将
object2
的引用复制到
object1
,因此
object1
object2
指向同一个对象。对吗

我编写了一个函数对堆栈进行排序

import java.util.Stack;

public class sortStack {

    public static void main(String[] str) {
        Stack<Integer> s = new Stack<Integer>();
        s.push(2);
        s.push(21);
        s.push(43);
        s.push(3);
        s.push(87);
        s.push(2);
        s.push(12);
        s.push(10);
        s.push(25);
        sortStack(s);

        while (!s.isEmpty()) {
            System.out.print(s.pop() + " ");
        }
    }

    public static void sortStack(Stack<Integer> src) {
        Stack<Integer> dst = new Stack<Integer>();
        Stack<Integer> buf = new Stack<Integer>();//buffer

        while (!src.isEmpty()) {
            int v = src.pop();
            if (dst.isEmpty()) {
                dst.push(v);
            }

            while (!dst.isEmpty() && dst.peek() > v) {
                buf.push(dst.pop());
            }

            dst.push(v);
            while (!buf.isEmpty()) {
                dst.push(buf.pop());
            }
        }
        src = dst;

        //Print:
        //while(!src.isEmpty()){
        //  System.out.print(src.pop()+" ");
        //}
    }
}
import java.util.Stack;
公共级索茨塔克{
公共静态void main(字符串[]str){
堆栈s=新堆栈();
s、 推(2);
s、 推(21);
s、 推(43);
s、 推(3);
s、 推(87);
s、 推(2);
s、 推(12);
s、 推(10);
s、 推(25);
索茨塔克(s);;
而(!s.isEmpty()){
System.out.print(s.pop()+“”);
}
}
公共静态void sortStack(堆栈src){
堆栈dst=新堆栈();
Stack buf=new Stack();//缓冲区
而(!src.isEmpty()){
int v=src.pop();
if(dst.isEmpty()){
dst.推力(v);
}
而(!dst.isEmpty()&&dst.peek()>v){
buf.push(dst.pop());
}
dst.推力(v);
而(!buf.isEmpty()){
dst.push(buf.pop());
}
}
src=dst;
//打印:
//而(!src.isEmpty()){
//System.out.print(src.pop()+);
//}
}
}
我无法从类中获得任何输出。如果我取消对打印部分的注释,则可以。 我不明白调用函数后,
s
堆栈是空的。我已经将
dst
分配给了s,所以s应该指向
dst
堆栈,对吗


请帮助!谢谢!

您正在为参数src分配一个引用,它实际上是一个局部变量,因此您没有看到对原始堆栈变量s的任何影响。相反,让方法返回dst并分配返回的对象。即

public static Stack<Integer> sortStack(Stack<Integer> src) {
    // ....

   return dst;
}

当您设置
src=dst
时,您只会覆盖方法中引用的本地副本。在调用方法的过程中,每个参数都有本地副本,这样在方法中,通过其方法修改src将在方法之外产生效果,但将src分配给新引用(如dst)则不会


如果在
sortStack
返回dst
,并在调用函数中放入
s=sortStack
,代码将正常工作。

堆栈通常用于FILO操作(先进先出)。为什么不使用简单的可排序集合,如
ArrayList
?相关:Java不是按引用传递的。它是严格按值传递的,只有一些值恰好是对象引用。@MenoHochschild问题不允许使用ArrayList。这就像面试问题一样。
s = sortStack(s);