? ? ? ?當(dāng)時(shí)在做這么一個(gè)需求,需要統(tǒng)計(jì)一個(gè)應(yīng)用的所有調(diào)用信息,包括各個(gè)ip的調(diào)用信息吐绵,整個(gè)應(yīng)用所有的調(diào)用信息。流程大概是這樣:
1.從一個(gè)rest接口讀取所有的調(diào)用信息,信息包含appName己单、ip唉窃、count等字段。
2.轉(zhuǎn)換為java的對(duì)象纹笼,每一個(gè)對(duì)象代表一個(gè)ip的調(diào)用信息纹份。
3.有一個(gè)HashMap存放所有的對(duì)象,key值為ip值廷痘。
4.有一個(gè)特殊的key為:all蔓涧,代表所有的調(diào)用信息。值為list牍疏,包含所有ip的對(duì)象蠢笋。
5.聚合all的list對(duì)象,計(jì)算一個(gè)總值鳞陨。
? ? ? 問題來了昨寞,我當(dāng)時(shí)為了節(jié)省內(nèi)存,性能厦滤。采用的合并聚合的方式是把后邊的值聚合到list的第一個(gè)對(duì)象中去援岩。 最后問題的現(xiàn)象是:有一個(gè)ip的count和all的count一模一樣。因?yàn)閍ll和這個(gè)ip引用到了同一個(gè)對(duì)象掏导,而all把這個(gè)對(duì)象給修改了享怀。
現(xiàn)在想想,jdk把Integer趟咆、String等等對(duì)象設(shè)置為不可變的對(duì)象是多么偉大正確的事情添瓷。