Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 性能:包含大量对象的列表与包含较小列表的大量对象_Java_Performance_Arraylist_History_Revert - Fatal编程技术网

Java 性能:包含大量对象的列表与包含较小列表的大量对象

Java 性能:包含大量对象的列表与包含较小列表的大量对象,java,performance,arraylist,history,revert,Java,Performance,Arraylist,History,Revert,我目前正在开发自己的应用程序(只是著名的《生活游戏》的另一部翻拍版),我想添加一个“还原”按钮。我的游戏基本上由一个二维数组组成:Cell[][]。。。 所以:我的想法是创建一个数组列表,该数组将被添加到每个更新中。。。(限50项) 但后来我想,那将是列表中的很多对象。。。因此: 在二维数组中的每个单元格中都有一个包含其自身历史的ArrayList,还是有一个包含整个游戏状态作为历史的巨大ArrayList更有效 (我认为你不需要我的任何代码来回答这个问题,但如果你需要,我会发布它)在我看来,每

我目前正在开发自己的应用程序(只是著名的《生活游戏》的另一部翻拍版),我想添加一个“还原”按钮。我的游戏基本上由一个二维数组组成:Cell[][]。。。 所以:我的想法是创建一个数组列表,该数组将被添加到每个更新中。。。(限50项) 但后来我想,那将是列表中的很多对象。。。因此:

在二维数组中的每个单元格中都有一个包含其自身历史的ArrayList,还是有一个包含整个游戏状态作为历史的巨大ArrayList更有效


(我认为你不需要我的任何代码来回答这个问题,但如果你需要,我会发布它)

在我看来,每个单元格的
数组列表可以很好地工作;但是,如果您只想存储50个州,则必须创建自定义ADT或利用Guava的Collections API


我建议使用
堆栈
而不是
数组列表
,因为还原每个单元格将是一个简单的操作。在Java中,正确使用的ADT是
ArrayQue
,但您必须自己处理容量。

在我看来,每个单元格使用
ArrayList
就可以了;但是,如果您只想存储50个州,则必须创建自定义ADT或利用Guava的Collections API

我建议使用
堆栈
而不是
数组列表
,因为还原每个单元格将是一个简单的操作。在Java中,正确使用的ADT是
ArrayQue
,但您必须自己处理容量。

与其存储单元状态,为什么不保留转换单元状态的事件?一个事件将简单地封装上一个状态信息和下一个状态,甚至可能封装一个可以反向执行的编码枚举。这将大大减少您需要存储的数据

此外,如果您是在本机上工作,或者在Java或C#等垃圾收集VM平台上工作,这也会有所不同。前者往往速度更快,在大寻址存储方面也更宽容,而后者在存储大量对象时可能会开始疯狂地破坏

但真正的证据是在吃东西/罐头食品中:没有最快的代码(c)Michael Abrash->即,对代码进行基准测试并找出答案!(来告诉我们)

与其存储单元状态,为什么不保留转换单元状态的事件?一个事件将简单地封装上一个状态信息和下一个状态,甚至可能封装一个可以反向执行的编码枚举。这将大大减少您需要存储的数据

此外,如果您是在本机上工作,或者在Java或C#等垃圾收集VM平台上工作,这也会有所不同。前者往往速度更快,在大寻址存储方面也更宽容,而后者在存储大量对象时可能会开始疯狂地破坏


但真正的证据是在吃东西/罐头食品中:没有最快的代码(c)Michael Abrash->即,对代码进行基准测试并找出答案!(来告诉我们)

如果最新的州是第50(100/…)个州,我想把最古老的州去掉。。。或者使用堆栈有什么真正的优势?我从来没有使用过它们,因为使用
堆栈
会更容易使用,而
ArrayDeque
允许您编辑集合的两侧,这意味着您可以同时添加新元素和删除最旧的元素。好吧,我只是给每个单元格一个ArrayList,其中包含表示其状态的布尔值。。。也许这不是最有效的方法,但它是最简单的,它的工作原理就像一个查米人的想法,如果最新的状态将是第50个(100/…)状态,则只删除最旧的状态。。。或者使用堆栈有什么真正的优势?我从来没有使用过它们,因为使用
堆栈
会更容易使用,而
ArrayDeque
允许您编辑集合的两侧,这意味着您可以同时添加新元素和删除最旧的元素。好吧,我只是给每个单元格一个ArrayList,其中包含表示其状态的布尔值。。。也许这不是最有效的方法,但它是最简单的,它就像一个魔咒,我该如何存储事件?第一:我没有任何活动,但我可以创造一些。。。第二:如果我想存储它们,那不是和存储状态差不多吗?一个具有单个单元格状态的数组列表只是一个布尔值列表,所以我不认为事件列表的数据量会更少来回答你的第二个问题:如果你所有的单元格都在不断变化,是的,但不一定是这样。这取决于转换规则和状态数据的“丰富程度”。例如,在游戏的基本版本中,许多著名的模式通常只是简单地在多个固定动作的帧上重复。这也可以用来节省空间。哦,是的,听起来很聪明!但是仍然:假设我不会将状态放入列表中,但是相反,如果状态改变,我只会添加一个true,如果状态没有改变,则添加一个false。。。如果在一个50x50的字段中,每帧平均只有20个单元格发生变化,那么当只存储变化的单元格时,每帧的内存消耗量不到1%,而不是每帧存储2500个状态单元格。或者,您也可以将电路板细分为块,并在哈希函数中使用位,以便将每个块存储为字符串。您甚至可以使用字典来引用先前已处于活动状态的块。如何存储事件?第一:我没有任何活动,但我可以创造一些。。。第二:如果我想存储它们,那不是和存储状态差不多吗?一个具有单个单元格状态的数组列表只是一个布尔值列表,所以我不认为事件列表的数据量会更少