【发布时间】:2017-08-04 13:38:02
【问题描述】:
就性能和内存而言,哪个效率最高?
现在,我有一个 List<ArrayList<String>>,它包含近 200,000 条记录,由单独的业务逻辑生成。我正在尝试使用 Thymeleaf 在 HTML 页面中以表格格式打印它。
目前,我正在使用嵌套的th:each 循环来打印带有th:text 的数据。正如预期的那样,这需要很长时间。
我查看了this,发现th:utext可以用来打印Thymeleaf中的html内容。
我生成这 200,000 条记录的业务逻辑,目前给出了一个 List<ArrayList<String>> 对象,但我可以通过更改将其修改为 List<String> 对象。
不过,我的问题是,这样会更节省内存吗?很有可能它会提高性能效率,但我主要关心的是内存效率。 List<ArrayList<String>> 会占用与包含相同数据的List<String> 相同的内存量吗? (通过相同的数据,我的意思是,内容是相同的 - 而不是 ArrayList<String>,它将包含一个带有 HTML 元素的字符串)。还是会占用更多内存?
我对理解数据结构的空间复杂性相对较新;因此查询。
【问题讨论】:
-
大声笑尝试创建一个包含 200K 数据的 html 表永远不会有效:D。可能您可能想要创建一个分页列表。 200K的ArrayList并不多,我认为你的问题是有一个包含200K行的字符串
-
@nafas 有一个很好的观点。使用您当前的结构,很容易实现分页功能。但是,如果您坚持发布这 20 万条记录,则将其更改为 List
不会提高或降低性能效率。更改可能会导致非常轻微的内存减少。 -
正如@Kylon 所说,它不会有很大的不同。但是:在 200K 记录的单元格中,我希望有很多重复的条目,每个条目都不需要单独的 String 实例。尝试共享常见的 String 实例(可能使用 String.intern())可能会减少您的内存占用。使用 List
版本,常见的完整行的概率肯定会更低。但是,如果 Thymeleaf 首先创建一个带有完整页面的 StringBuilder 而不是即时输出元素(我不知道 Thymeleaf),那么这一切都无关紧要——那么你就迷路了。
标签: java list arraylist thymeleaf