Java 从对象列表中获取上次更新记录时,使用映射的正确方法是什么
以下两种从列表中获取最后更新记录的方法有什么区别?哪种方法更好?为什么 范例- 假设消息列表按消息对象的顺序包含记录:Java 从对象列表中获取上次更新记录时,使用映射的正确方法是什么,java,performance,Java,Performance,以下两种从列表中获取最后更新记录的方法有什么区别?哪种方法更好?为什么 范例- 假设消息列表按消息对象的顺序包含记录: Message { Integer id ; String name ; } 列表中名为“messages”的值包含 [1 , "a"],[2, "b"],[1 , "b"],[1, "c"] 结果应该只包含这两条记录- [2, "b"] ,[1, "c"] 溶液1- Map<Integer,String> latestMessage = new
Message
{
Integer id ;
String name ;
}
列表中名为“messages”的值包含
[1 , "a"],[2, "b"],[1 , "b"],[1, "c"]
结果应该只包含这两条记录-
[2, "b"] ,[1, "c"]
溶液1-
Map<Integer,String> latestMessage = new HashMap<>();
for (Message m : messages) {
latestMessage.put(m.getId(), m.getName());
}
Map latestMessage=newhashmap();
对于(消息m:messages){
latestMessage.put(m.getId(),m.getName());
}
解决方案2-
Map<Integer,String> latestMessage = new HashMap<>();
for (Message m : messages) {
if(!latestMessage.containsKey(m.getId())) {
latestMessage.put(m.getId(), m.getName());
}
else {
latestMessage.replace(m.getId(), m.getName()) ;
}
}
Map latestMessage=newhashmap();
对于(消息m:messages){
if(!latestMessage.containsKey(m.getId())){
latestMessage.put(m.getId(),m.getName());
}
否则{
替换(m.getId(),m.getName());
}
}
我会选择前者(put
),因为您没有使用消息,甚至没有尝试合并(我之所以强调这一点是因为Java 8和方法):
你也不会做这样的事情:
Map<String, List<String>> map = ...;
for (Message m : messages)
map.computeIfAbsent(m.getId(), k -> new ArrayList<>()).add(m.getName());
回到您的两个用例:
- 使用
也较短且更容易理解:后者(put
+containsKey
/put
)将更难理解(不是更难理解,但仍然需要阅读代码才能理解)replace
- 就性能而言,使用
应该比检查映射是否存在快一点,因为您需要执行更多的操作。我不会为此火上浇油,但您必须编写一个基准(使用JMH)来比较哪个更好put
containsKey
+put
/replace
更好,否则请使用put。我会选择前者(put
),因为你没有使用消息,甚至没有尝试合并(我强调这一点是因为Java 8和方法):
你也不会做这样的事情:
Map<String, List<String>> map = ...;
for (Message m : messages)
map.computeIfAbsent(m.getId(), k -> new ArrayList<>()).add(m.getName());
回到您的两个用例:
- 使用
也较短且更容易理解:后者(put
+containsKey
/put
)将更难理解(不是更难理解,但仍然需要阅读代码才能理解)replace
- 就性能而言,使用
应该比检查映射是否存在快一点,因为您需要执行更多的操作。我不会为此火上浇油,但您必须编写一个基准(使用JMH)来比较哪个更好put
TL;DR:使用put,除非你能证明
containsKey
+put
/replace
更好。我尝试了以下代码,以查看你给出的方法之间的性能差异:
公共类MapPerformanceTest{
公共静态void main(字符串[]args){
Map Map=newhashmap();
//用50000个实体填充地图
整数计数=50000;
for(int i=0;i
运行上述代码时,它会在控制台上打印以下内容:
PUT: 17171025
REPLACE: 18274190
这意味着第一种方法的性能稍好一些。我尝试了以下代码,以查看您给出的方法之间的性能差异:
公共类MapPerformanceTest{
公共静态void main(字符串[]args){
Map Map=newhashmap();
//用50000个实体填充地图
整数计数=50000;
for(int i=0;i