在java中保持地址空间不变

在java中保持地址空间不变,java,Java,我试图保持我的地址不变,因为我有一个JList指向listAccts。如何使ListAccts具有相同的地址空间?基本上,我如何复制这个对象 public class BankEngine extends AbstractListModel { /** holds the accounts inside the bank engine */ private ArrayList<Account> listAccts; /** holds all the actions the use

我试图保持我的地址不变,因为我有一个
JList
指向
listAccts
。如何使
ListAccts
具有相同的地址空间?基本上,我如何复制这个对象

public class BankEngine extends AbstractListModel {

/** holds the accounts inside the bank engine */
private ArrayList<Account> listAccts;
/** holds all the actions the user has done. */
private ArrayList<Action> actions;
/** holds old versions of the bank. */
private ArrayList<ArrayList<Account>> oldEngines;

/*****************************************************************
 * Constructor that creates a new BankEngine, the core of the project
 ******************************************************************/
public BankEngine() {
    listAccts = new ArrayList<Account>();
    // actions = new ArrayList<Action>();
    oldEngines = new ArrayList<ArrayList<Account>>();
    oldEngines.add(listAccts);
}
public void undo() {
    if (oldEngines.size() == 0) {

    } else {
        listAccts = oldEngines.get(oldEngines.size()-1); <--- I want this to have the same listAccts pointer.

}
公共类BankEngine扩展了AbstractListModel{
/**在银行引擎中保存帐户*/
私有ArrayList列表帐户;
/**保存用户已执行的所有操作*/
私人诉讼;
/**持有银行的旧版本*/
私有ArrayList旧引擎;
/*****************************************************************
*创建新的BankEngine(项目的核心)的构造函数
******************************************************************/
公共银行引擎(){
listAccts=newarraylist();
//actions=newarraylist();
oldEngines=new ArrayList();
旧引擎。添加(列表帐户);
}
公共作废撤消(){
如果(oldEngines.size()==0){
}否则{

listAccts=oldEngines.get(oldEngines.size()-1);java进程中的所有对象共享相同的地址空间,即运行的JVM的地址空间

如果您的意思是希望listAccts本质上与以前相同,即不想创建新列表,那么您需要做的是:

listAccts.addAll(oldEngines.get(oldEngines.size() - 1));

i、 例如,操纵现有列表,而不是创建新对象。

如果我理解正确,您希望确保
listAccts
在代码的整个生命周期中引用相同的物理对象。除非您指定
listAccts
引用不同的对象(在代码中您没有向我们显示),这是给定的

执行
oldEngines.add(listAccts)
后,
oldEngines
将包含对同一对象的引用
listAccts
所引用的对象。但是,
listAccts
不会以任何方式更改-它仍然引用完全相同的对象

所以-再次:除非您在代码中重新分配
listAccts
,否则您没有向我们显示该行

listAccts = oldEngines.get(oldEngines.size()-1);
看起来完全没有必要。事实上,如果您同时向
oldEngines
添加了其他元素,那么它的最后一个元素将不再引用同一个对象
listAccts

还要注意的是,Java没有指针,只有引用变量实际上是引用,而不是对象的按值副本。JVM实际上可以更改引擎盖下对象的物理内存位置,更新对这些对象的所有引用。我们无法注意到这一点,因为无法从引用中获取实际的物理内存地址(至少在Java中——我想你可以使用JNI)引用是比指针更高层次的抽象——它不是内存地址。这就是为什么像地址空间这样的术语在Java中毫无意义

更新 我想做的是让最后一个旧引擎取代当前的listAccts

如果要将
listAccts
引用更改为指向
oldEngine
中的最后一个元素,您已经在这样做了。如果要将
oldEngine
中最后一个元素的内容复制到当前的
listAccts
对象中(覆盖其当前内容),请尝试


我的问题是,我将相同的旧listAccts传递到数组列表中,没有说“new”。即使我说了“new”我在传递listAccts中的帐户,因此arraylist将是新的,但新数组列表中的帐户将是我想要备份的帐户。我要做的是使用此方法从深度副本创建一个新对象


感谢所有提供帮助的人。

您在功能上到底想做什么?但是,我该如何解决依赖列表帐户未更新的JList问题?我认为使用“地址空间”一词这个问题有误导性,Dante并不是这个意思,因为正如你所说,java中的所有对象都在同一个地址空间。我想他是在试图了解他是否有对象的副本或对同一对象的引用,以及他将如何做一个而不是另一个。好吧,我试图做的是使最后一个旧引擎e正在替换当前的listAccts。
listAccts.clear();
listAccts.addAll(oldEngines.get(oldEngines.size()-1));