误用ArrayListMultimap引发的问题

最近生产环境的系统在运行一段时间后,用户登录速度越来越慢,但是重启某一模块后,用户登录恢复正常。如此反复,令人提心吊胆。于是下定决心,找出问题原因。

趁着系统运行低峰期,打印出相应Dump文件,发现Dump文件中在ArrayListMultimap对象处包含大量HashMap$Entry,由于涉及信息安全,在这里就不粘贴其对应的Dump数据了。分析存在问题的代码发现原作者引用了如下数据结构:

Multimap<Long,Long> syncMap = ArrayListMultimap.create();

但是根据原代码的业务逻辑,此处的(key,value )应当是不允许重复的。基于此分析,基本可以确定此处为对象误用:将HashMultimap误用为ArrayListMultimap.

那么ArrayListMultimap与HashMultimap在对象去重上有啥区别呢?下面以示例来进行说明:

一、ArrayListMultimap存储对象

Multimap<String,String> multimap= ArrayListMultimap.create();
multimap.put("Fruits","Banana");
multimap.put("Fruits","Apple");
multimap.put("Fruits","Apple");
int size=multimap.size();
#3
System.out.println(size);
Collection<String> fruits = multimap.get("Fruits");
#[Banana,Apple,Apple]
System.out.println(fruits);

二、HashMultimap存储对象

Multimap<String,String> multimap= HashMultimap.create();
multimap.put("Fruits","Banana");
multimap.put("Fruits","Apple");
multimap.put("Fruits","Apple");
int size=multimap.size();
#2
System.out.println(size);
Collection<String> fruits = multimap.get("Fruits");
#[Banana,Apple]
System.out.println(fruits);
时间: 2024-10-18 23:02:52

误用ArrayListMultimap引发的问题的相关文章

关于std:auto_ptr std:shared_ptr std:unique_ptr

很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生成健壮的代码.本文阐述了如何正确运用auto_ptr来让你的代码更加安全——以及如何避免对auto_ptr危险但常见的误用,这些误用会引发间断性发作.难以诊断的bug. 1.为什么称它为“自动”指针?auto_ptr只是众多可能的智能指针之一.许多商业库提供了更复杂的智能指针,用途广泛而令人惊异,从管理引用的数量到提供先进的代理服

C++安全异常std:auto_ptr

auto_ptr它是C++标准库(<utility>)为了一个智能指针类模板来解决资源泄漏所提供的问题(注意:这只是一个简单的智能指针) auto_ptr在事实原则的实现RAII,对资源的访问,在施工时间.释放资源时,析构函数,而相关的指针操作超载.使用起来就像普通的指针. std::auto_ptr<ClassA> pa(new ClassA); 非常多人听说过标准auto_ptr智能指针机制,但并非每一个人都天天使用它.这真是个遗憾.由于auto_ptr优雅地攻克了C++设计和

javascript基础修炼(2)——What‘s this(上)

javascript基础修炼(2)--What's this(上) 开发者的javascript造诣取决于对[动态]和[异步]这两个词的理解水平. [TOC] 一.this是什么 this是javascript关键字之一,是javascript能够实现面向对象编程的核心概念.用得好能让代码优雅高端,风骚飘逸,用不好也绝对是坑人坑己利器.我们常常会在一些资料中看到对this的描述是: this是一个特殊的与Execution Contexts相关的对象,用于指明当前代码执行时的Execution

一个回车符引发的问题思考

在维护和开发通信类软件产品的过程中,经常需要处理一些软件故障问题.在问题刚出现的时候,大家可能显得手足无措,有一种天都要塌下来的感觉.但在问题原因找到之后,大家又会觉得问题原因非常的简单,要是当初开发的时候仔细一点,是不会犯这样的低级错误的.最近,本人就遇到了一个回车符引发的问题. 近日,在开发某软件版本时需要对文件进行操作,在代码中使用了Linux C语言中的opendir函数,但是该函数始终返回NULL,提示文件路径不存在. 本人查了一下该函数的具体情况.opendir函数的原型为: DIR

C语言的一些误用和知识总结

在学习单片机的时候才真正知道C语言是什么它是来干什么的~但是C语言用到嵌入式只是它小小的一部分他的应用还有很多地方呢,呵呵我们这里就不讨论这个了.我们是不是在写程序的时候错误很多就算编译通过了也达不到我们预期的结果,完了自己是不是也很难找到错在哪儿吧?我绝得语言之所以能称之为语言,它肯定是一种工具一种相互交流相互通信相互传达之间的意图的工具,作为语言那肯定得有自己的语法,要想相互交流肯定得先学好它的语法吧(比如像表达式,函数,循环,指针)我称之为C语言的语法.C语言虽然很强大但是他也有不少陷阱,

【转】在单片机中,C语言的一些误用和总结!

在学习单片机的时候才真正知道C语言是什么,它是来干什么的~但是C语言用到嵌入式只是它小小的一部分应用,还有很多地方呢. 我们是不是在写程序的时候,错误很多就算编译通过了也达不到我们预期的结果,完了自己是不是也很难找到错在哪儿吧?我觉得语言之所以能称之为语言,它肯定是一种工具,一种相互交流相互通信相互传达之间的意图的工具,作为语言那肯定得有自己的语法,要想相互交流肯定得先学好它的语法吧(比如像表达式,函数,循环,指针)我称之为C语言的语法.C语言虽然很强大但是也有不少陷阱,所以写此文有两个目的,一

由爬虫引发的思考

前言 花了两天时间写一个简单的爬虫程序.目前所用的技术十分简单.就是获得目标页面的html文档内容,然后解析其中有用的内容.既没有实现模拟登陆,也没有任何防止反爬虫的措施,甚至没有使用多线程.不过在其中遇到的问题还是引发了我很多的思考与问题,比如爬虫的合法性问题以及爬虫的危害等.于是写下这篇文章记录一下.由于本人经验有限,引用参考了大量文章,有问题请指出. 爬虫的作用与危害 爬虫的作用 网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是

Vue引发的getter和setter

Vue引发的getter和setter 公司的新项目决定使用Vue.js来做,当我打印出Vue实例下的data对象里的属性时,发现了一个有趣的事情: 它的每个属性都有两个相对应的get和set方法,我觉的这是多此一举的,于是去网上查了查Vue双向绑定的实现原理,才发现它和Angular.js双向绑定的实现原理完全不同,Angular是用的数据脏检测,当Model发生变化,会检测所有视图是否绑定了相关数据,再更改视图.而Vue使用的发布订阅模式,是点对点的绑定数据. Vue的数据绑定只有两个步骤,

Android FastJson与不规范JSON引发的血案

去公司实习了,没多少时间更博客了,距离上一篇博客也有一个来月了.看标题,应该可以看出,这篇文章是讲一个坑,以及如何填坑. 坑是什么?有两个坑,其一是fastjson的bug,其二是不规范的json字符串.如何填坑,不要着急,后文详细说明. 首先,我们看一个json字符串 { "doubleParam": 4.875, "floatParam": 2.76, "extra": { "doubleParam": 12.23, &q