有 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 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) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    在执行oldEngines.add(listAccts)之后,oldEngines将包含对listAccts所引用的同一对象的引用。然而,listAccts并没有以任何方式改变——它仍然指向完全相同的对象

    所以——再说一遍:除非你在代码中重新分配listAccts,否则你还没有给我们看——这一行

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

    我觉得完全没必要。事实上,如果您同时向oldEngines添加了其他元素,那么它的最后一个元素将不再引用listAccts所引用的同一个对象,这可能会让您感到困惑

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

    更新

    what I'm trying to do is make it so that the last oldEngine is now replacing what is the current listAccts.

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

    listAccts.clear();
    listAccts.addAll(oldEngines.get(oldEngines.size()-1));
    
  3. # 3 楼答案

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

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

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

  4. # 4 楼答案

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

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

    感谢所有提供帮助的人