? ? ? ?當時在做這么一個需求,需要統計一個應用的所有調用信息,包括各個ip的調用信息,整個應用所有的調用信息。流程大概是這樣:
1.從一個rest接口讀取所有的調用信息,信息包含appName、ip、count等字段。
2.轉換為java的對象,每一個對象代表一個ip的調用信息。
3.有一個HashMap存放所有的對象,key值為ip值。
4.有一個特殊的key為:all,代表所有的調用信息。值為list,包含所有ip的對象。
5.聚合all的list對象,計算一個總值。
? ? ? 問題來了,我當時為了節省內存,性能。采用的合并聚合的方式是把后邊的值聚合到list的第一個對象中去。 最后問題的現象是:有一個ip的count和all的count一模一樣。因為all和這個ip引用到了同一個對象,而all把這個對象給修改了。
現在想想,jdk把Integer、String等等對象設置為不可變的對象是多么偉大正確的事情。