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
    )将更难理解(不是更难理解,但仍然需要阅读代码才能理解)
  • 就性能而言,使用
    put
    应该比检查映射是否存在快一点,因为您需要执行更多的操作。我不会为此火上浇油,但您必须编写一个基准(使用JMH)来比较哪个更好
TL;DR:除非你能证明
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
    )将更难理解(不是更难理解,但仍然需要阅读代码才能理解)
  • 就性能而言,使用
    put
    应该比检查映射是否存在快一点,因为您需要执行更多的操作。我不会为此火上浇油,但您必须编写一个基准(使用JMH)来比较哪个更好

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