当时在做这么一个需求,需要统计一个应用的所有调用信息,包括各个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等等对象设置为不可变的对象是多么伟大正确的事情。