在java中保持地址空间相同

时间:2011-03-03 08:14:53

标签: 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 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.

}

4 个答案:

答案 0 :(得分:1)

java进程中的所有对象共享相同的地址空间,即正在运行的JVM的地址空间

答案 1 :(得分:1)

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

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

所以 - 再说一遍:除非你在代码中重新分配listAccts但你没有向我们展示 - 行

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

对我来说完全没用。事实上,如果你在此期间向oldEngines添加了其他元素,那么它可能会让你感到困惑,因为它的最后一个元素将不再引用同一个对象listAccts

另请注意,Java没有指针,只有引用。所有非原始(对象)变量实际上是引用,而不是对象的按值副本。并且JVM实际上可以更改引擎下的对象的物理内存位置,更新对这些对象的所有引用。我们无法注意到这一点,因为没有办法从引用中获取实际的物理内存地址(至少在Java中 - 我猜你可以使用例如JNI)。引用是比指针更高级别的抽象 - 它不是内存地址。这就是为什么像地址空间这样的术语在Java中没有意义。

更新

  

我正在尝试做的是让最后一个oldEngine正在替换当前listAccts。

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

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

答案 2 :(得分:0)

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

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

即,操纵现有列表而不是创建新对象。

答案 3 :(得分:0)

我的问题是我将相同的旧listAccts传递给数组列表,而没有说“new”。即使当我说“新”时,我也会传递listAccts中的帐户,因此arraylist将是新的,但新数组列表中的帐户将是我想备份的帐户。我要做的是使用这种方法从深层复制创建一个新对象。

http://www.javaworld.com/javaworld/javatips/jw-javatip76.html?page=2

感谢所有提供帮助的人。