在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.
}
# 1 楼答案
java进程中的所有对象共享相同的地址空间,即运行的JVM的地址空间
# 2 楼答案
如果我理解正确,您希望确保
listAccts
在代码的整个生命周期中引用相同的物理对象。除非您指定listAccts
来引用不同的对象(在代码中,您没有向我们展示),否则这是一个给定的在执行
oldEngines.add(listAccts)
之后,oldEngines
将包含对listAccts
所引用的同一对象的引用。然而,listAccts
并没有以任何方式改变——它仍然指向完全相同的对象所以——再说一遍:除非你在代码中重新分配
listAccts
,否则你还没有给我们看——这一行我觉得完全没必要。事实上,如果您同时向
oldEngines
添加了其他元素,那么它的最后一个元素将不再引用listAccts
所引用的同一个对象,这可能会让您感到困惑还要注意,Java没有指针,只有引用。所有非原语(对象)变量实际上都是引用,而不是对象的按值副本。JVM实际上可以更改引擎盖下对象的物理内存位置,更新对这些对象的所有引用。我们没有办法注意到这一点,因为没有办法从引用中获取实际的物理内存地址(至少在Java中——我想你可以使用JNI来实现)。引用是比指针更高级别的抽象——它不是内存地址。这就是为什么地址空间这样的术语在Java中毫无意义
更新
如果您想将
listAccts
引用更改为指向oldEngine
中的最后一个元素,那么您已经这样做了。如果要将oldEngine
中最后一个元素的内容复制到当前listAccts
对象中(覆盖其当前内容),请尝试# 3 楼答案
如果您的意思是希望
listAccts
本质上与之前相同,即不想创建新列表,那么您需要做的是:即,操纵现有列表,而不是创建新对象
# 4 楼答案
我的问题是,我将相同的旧listAccts传递给数组列表,而没有说“new”。即使当我说“new”时,我也在传递listAccts中的帐户,因此arraylist将是新的,但新数组列表中的帐户将是我想要备份的帐户。我要做的就是用这种方法从深度副本创建一个新对象
http://www.javaworld.com/javaworld/javatips/jw-javatip76.html?page=2
感谢所有提供帮助的人