确保在Java中保留列表中的顺序并提高效率

确保在Java中保留列表中的顺序并提高效率,java,image,Java,Image,我正在用Java创建一个照片马赛克。它的输入是目标图像和一组分片。下面是我的算法: a. Read all the tiles from the directory and process* it. [Every tile is of the same dimension.] b. Read the target image, break it into cells [cells are of dimensions of a tile.] c. Process* all the cells. d

我正在用Java创建一个照片马赛克。它的输入是目标图像和一组分片。下面是我的算法:

a. Read all the tiles from the directory and process* it. [Every tile is of the same dimension.]
b. Read the target image, break it into cells [cells are of dimensions of a tile.]
c. Process* all the cells.
d. For each cell:
  d.1. Create a HashMap h [where key=euclidean metric, value=corresponding tile]
  d.2. For each tile:
    d.2.1 Calculate Euclidean metric.
    d.2.2 add it to h.
  d.3 Calculate min from h.
  d.4 Add the min to an outputList
e. Create the image from list of images in the outputList.
*process方法接收一个图像并创建一个我们定义的类的对象,该类称为
ImageDetails
。因此,对于处理的每个瓷砖和单元格,都会创建一个
ImageDetails
对象,该对象存储RGB值和尺寸等细节。有两个单独的对象列表:一个用于
平铺
,另一个用于
单元格

问题是平均约有300块瓷砖和多达50000个电池(可能还不止这些!)。因此,当我的程序运行时,除了它执行的计算和其他ip/op操作之外,它在内存中还有许多对象

当我在资源不足(可用内存较少)的机器上运行此程序时,创建的输出图像会失真。但当我在有更多可用资源的机器上运行它时,它是完美的。我认为这是因为当没有可用资源时,它不能同时保存内存中的所有对象。因此,我看到一个图像,其中有错位的瓷砖。但当它有足够的内存,我看到完美的输出图像

如何确保在不考虑可用内存的情况下,我可以保留在
输出列表中添加的元素的顺序
,以便我可以看到没有失真的图像

谢谢

编辑:

下面是同一程序输出的两幅图像。唯一的区别是它们在不同的机器上运行。请帮助我理解给定算法和约束条件下程序输出的差异


它可能与内存没有直接关系——要么你有足够的内存,要么你没有


outputList使用哪个集合类?ArrayList和LinkedList都应该保证元素的顺序。

它可能与内存没有直接关系-要么你有足够的内存,要么你没有

outputList使用哪个集合类?ArrayList和LinkedList都应该保证元素的顺序

下面是同一程序输出的两幅图像。唯一的区别是它们在不同的机器上运行。请帮助我理解给定算法和约束条件下程序编译的差异

编译没有什么区别

内存大小应该没有区别。或者至少,它不应该引起这种问题

我怀疑您看到的实际上是由于多线程应用程序中的不正确同步造成的。但是,如果没有看到您的代码,我们不可能提供帮助。(我怀疑你的申请太大了,不适合在这么大的问题上发表。)

(另一种理论上的可能性是,您的应用程序正在“挤压”
OutOfMemoryError
异常。但我无法想象有人会做如此愚蠢的事情……)


我用例子更新了我的问题

它们不相关。请注意答案是什么。问题不太可能出现在JVM或Java运行库中。问题很可能出在您的代码中。如果不看实际的代码,我们不能更具体

下面是同一程序输出的两幅图像。唯一的区别是它们在不同的机器上运行。请帮助我理解给定算法和约束条件下程序编译的差异

编译没有什么区别

内存大小应该没有区别。或者至少,它不应该引起这种问题

我怀疑您看到的实际上是由于多线程应用程序中的不正确同步造成的。但是,如果没有看到您的代码,我们不可能提供帮助。(我怀疑你的申请太大了,不适合在这么大的问题上发表。)

(另一种理论上的可能性是,您的应用程序正在“挤压”
OutOfMemoryError
异常。但我无法想象有人会做如此愚蠢的事情……)


我用例子更新了我的问题


它们不相关。请注意答案是什么。问题不太可能出现在JVM或Java运行库中。问题很可能出在您的代码中。如果不看实际的代码,我们就不能更具体了。

outputList是一个ArrayList。我知道它确实保留了订单。但我觉得Java一次读取(例如)一半的对象,然后创建一个outputList,然后读取其余的对象,当它没有足够的资源时再执行一次。我这么说是因为我看到扭曲的图像,其中有一块细胞被错误地放置(即应该出现在底部的图像块出现在中间的某个地方)。我希望我明白了。我正试图发布一些图片,以便我的问题变得清晰。问题不太可能出现在代码之外的任何地方。这在业界被称为“编译器坏了”综合症。简而言之,不是,ArrayList类也不是。这并不是说编译器/JVM/JVM库类偶尔没有bug,而是它们总是比这更复杂/微妙。如果ArrayList不维护它的秩序,很多人会知道它并大声抱怨。我建议您将代码分解为可以进行单元测试的小单元,这样您就可以发现代码的问题。outputList是一个ArrayList。我知道它确实保留了订单。但我觉得Java一次读取(例如)一半的对象,然后创建一个outputList,然后读取其余的对象,当它没有足够的资源时再执行一次。我说