按值而不是 Java 中的引用添加到列表
Adding to a List by Value instead of reference in Java
我有一个地图列表,我想在 for 循环中向列表中添加一个地图。我听说使用 map.clear() 比创建新 Map 具有更好的性能,但我的问题是 List.add() 使用对象的引用并使用 Map.clear()引用未清除。
是否有可能强制 List.add() 使用该值或构建其他解决方法?
可以通过简单地创建 Map
的副本并插入副本来插入 "by value"。这样做的问题是它根本不是优化。
不是简单地创建一个新的空 Map
,而是创建一个已填充 Map
的副本并清除原始 Map
。这意味着:您不会避免创建新对象的开销,但还会引入复制和清除已填充 Map
.
的额外工作
关于一般优化的一点注意事项:
大约 10% 的代码将完成 90% 的工作(是的,这些数字是虚构的,但这是考虑优化并且至少接近现实的通常方式)。不要在第一个 运行 中过度优化您的代码。只做可以轻松完成的事情,而不会降低代码的可读性,运行 分析器并寻找代码的瓶颈并优化它们。这比优化整个代码要高效和容易得多。
如果您经常重复使用同一个地图,清除它而不是丢弃旧地图来构建新地图是有意义的。
但是在这里,你不想重复使用同一个Map,因为你想把它存储在一个List中。如果要清除它以便重新使用它,则必须将地图的副本添加到列表中才能拥有独立的地图。哪个性能更好是低级优化。你永远不必担心,除非:
- 您发现您的表现令人无法接受
- 你通过剖析发现,大部分时间都花在了那里
您应该只使用更多 clear/coherent 项目编码规则。我会在这里的每次迭代中创建一个全新的地图,但这只是我的意见。但请不要在早期开发阶段进行低级优化。
我有一个地图列表,我想在 for 循环中向列表中添加一个地图。我听说使用 map.clear() 比创建新 Map 具有更好的性能,但我的问题是 List.add() 使用对象的引用并使用 Map.clear()引用未清除。
是否有可能强制 List.add() 使用该值或构建其他解决方法?
可以通过简单地创建 Map
的副本并插入副本来插入 "by value"。这样做的问题是它根本不是优化。
不是简单地创建一个新的空 Map
,而是创建一个已填充 Map
的副本并清除原始 Map
。这意味着:您不会避免创建新对象的开销,但还会引入复制和清除已填充 Map
.
关于一般优化的一点注意事项:
大约 10% 的代码将完成 90% 的工作(是的,这些数字是虚构的,但这是考虑优化并且至少接近现实的通常方式)。不要在第一个 运行 中过度优化您的代码。只做可以轻松完成的事情,而不会降低代码的可读性,运行 分析器并寻找代码的瓶颈并优化它们。这比优化整个代码要高效和容易得多。
如果您经常重复使用同一个地图,清除它而不是丢弃旧地图来构建新地图是有意义的。
但是在这里,你不想重复使用同一个Map,因为你想把它存储在一个List中。如果要清除它以便重新使用它,则必须将地图的副本添加到列表中才能拥有独立的地图。哪个性能更好是低级优化。你永远不必担心,除非:
- 您发现您的表现令人无法接受
- 你通过剖析发现,大部分时间都花在了那里
您应该只使用更多 clear/coherent 项目编码规则。我会在这里的每次迭代中创建一个全新的地图,但这只是我的意见。但请不要在早期开发阶段进行低级优化。