从ConcurrentHashMap中取数据时,遇到很怪异的问题

问题描述

这是我的一段代码:public UserConnection getUserConnectionByToken(Token token) { // TODO Auto-generated method stub for (Iterator<Token> iter = (Iterator<Token>) TransactionManagerImpl.userConnections .keySet().iterator(); iter.hasNext();) { Token token1 = iter.next(); if(token1.equals(token)){ return userConnections.get(token1); } } return (UserConnection)userConnections.get(token); }其中userConnections是一个ConcurrentHashMap,里面的key是Token对象,value是UserConnection 对象,这是webservice服务端的一个方法,token是在客户端传过来的,都实现了序列化,但是在服务端处理的时候,直接 userConnections.get(token)却取不出来,但是通过迭代判断if(token1.equals(token)){return userConnections.get(token1);}却能取出来,这是怎么回事儿呢,哪位帮解释一下? 问题补充:beneo 写道

解决方案

你看看ConcurrentHashmap的get方法 /* Specialized implementations of map methods */ V get(Object key, int hash) { if (count != 0) { // read-volatile HashEntry<K,V> e = getFirst(hash); while (e != null) { if ([color=red]e.hash == hash && key.equals(e.key[/color])) { V v = e.value; if (v != null) return v; return readValueUnderLock(e); // recheck } e = e.next; } } return null; }看到红色部分么?你需要equals && == 你最好在hashcode相等的时候端点进去看看,是不是equals相等
解决方案二:
引用客户端打印的hashCode和服务端打印的hashCode值一样,但还是取不出来token1 和 token 的 hashCode 一样吗? 如果一样,肯定可以拿出来。
解决方案三:
用默认的hashcode,一般来说没有多少问题,除非你有特殊的要求非要使用自定义hashcode
解决方案四:
引用服务端的一个方法,token是在客户端传过来的,都实现了序列化这要在序列化之前就重写,序列化之后再重写就没意义了。
解决方案五:
你看看value是什么指,跟踪进去看看他hashcode的方法
解决方案六:
最简单打印所有的hashcode
解决方案七:
我说错了,反序列化和hashcode无关,如果你重写了hashcode,可能有隐患你的token不要重写hashcode,因为你如果都是一个object,但是因为string属性改变而使得hashcode改变,你的map就得不到,但是他们还是同样的object
解决方案八:
引用已经重写了equals和hashCode,Token只有一个String的属性看看你是如何重写的?
解决方案九:
map只是比较hashcode但是equals 是 ==所以出不来反序列化不能保证hashcode一致,你必须得重写hashcode

时间: 2024-08-02 22:25:45

从ConcurrentHashMap中取数据时,遇到很怪异的问题的相关文章

数据库取数据时怎么才能只取前10列的值

问题描述 数据库取数据时怎么才能只取前10列的值.不是前10行. 解决方案 解决方案二:不知道各个列的列名解决方案三:从系统表入手,表名称在sysobjects中,字段名称在syscolumns中,字段序号为syscolums.colidselecttop10b.namefromsysobjectsa,syscolumnsbwherea.id=b.idanda.xtype='U'anda.name='table_name'--此处换成要查找表名称orderbyb.colid 解决方案四:sele

sqlite删除数据库中的数据时偶尔会出现错误

问题描述 sqlite删除数据库中的数据时偶尔会出现错误 java.lang.IllegalStateException: Cannot perform this operation because the connection pool has been closed. 求助,connection pool 是啥啊,求大神指教. 解决方案 如果确定不是连接被关闭,那还有可能就是多线程访问sqlite,sqlite数据库是单线程操作的,那么当N多个Thread同时调用的时候,可能报这错误.这也就

mysql-再往数据库中添加数据时,起初可以添加进去,之后不知道是把电脑关了还是怎么老报错,而且添加不进去了

问题描述 再往数据库中添加数据时,起初可以添加进去,之后不知道是把电脑关了还是怎么老报错,而且添加不进去了 Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if

java-当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码?

问题描述 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码? 当用JDBC向数据库中插入数据或从数据库中提取数据时,为何有时中文字符会显示为乱码? 怎么才能解决问题,跟jdbc driver Manager的设置有关系吗? 解决方案 数据库字符集 与 页面编码 都使得 是 uft-8?得统一 解决方案二: 建议编码格式采用UTF-8的格式 解决方案三: 在使用数据的每一个节点上,其编码方式必须要一致否则就会出现乱码.特别是使用MySQL时,客户端,连接器.数据库

ajax-在jsp中添加数据时怎样验证重复?

问题描述 在jsp中添加数据时怎样验证重复? 在jsp页面中,有一个添加的表单,有几个文本框,在输入数据时,怎样验证输入的数据是否数据库中已经存在,如果有,提示一下.,求教,有代码最好 解决方案 在input中加上失去焦点onblur=""aa()"" 这aa()方法js调用后台执行查询来判断是否存在 解决方案二: 想实时判断,那你就发ajax去后台查询数据库,结果返回页面给提示事件就用对应input的失去焦点onblur代码?没有!自己网上找吧 解决方案三: ht

spark-在使用Spark Streaming向HDFS中保存数据时,文件内容会被覆盖掉,怎么解决?

问题描述 在使用Spark Streaming向HDFS中保存数据时,文件内容会被覆盖掉,怎么解决? 我的Spark Streaming代码如下所示: val lines=FlumeUtils.createStream(ssc,"hdp2.domain",22222,StorageLevel.MEMORY_AND_DISK_SER_2) val words = lines.filter(examtep(_)) words.foreachRDD(exam(_)) //some other

ist取数据-从List中取数据MP3文件并自动播放

问题描述 从List中取数据MP3文件并自动播放 我做一个MP3项目,没有列表的,只有一个播放界面.点进去就开始播放,现在我想要实现我点进去就随机播放我存在List集合中的一首歌曲!我已经存好了 在List中.具体要怎么实现. 解决方案 var currentItem=list.OrderBy(x=>Guid.NewGuid()).First(); 随机排序后取第一个即可 解决方案二: var currentItem=list[new Random().Next(0, list.Count)];

js-网页中取数据问题 ,我要在网页中取到别人的数据,存到我自己的数据库中用

问题描述 网页中取数据问题 ,我要在网页中取到别人的数据,存到我自己的数据库中用 (有截图发不了) 哎··· 现在有一个网页显示的层级关系数据,我要取到想办法存到我自己本地设计的对应数据库中, 同事说用js调试取到json,然后想办法存到sql数据库中.求大神指点 解决方案 前台用ajax拿到数据库中取到的json数组,在contorl层重新调用方法注入到你的数据库中去就行了呀! 解决方案二: 用php爬取网页数据---------------------- 解决方案三: 不能编写语言吗,比如说

jsp-JSP向数据库中插入数据时显示全都是问号,怎么能解决一下啊?

问题描述 JSP向数据库中插入数据时显示全都是问号,怎么能解决一下啊? 插入中文就显示问号,数据库里是空白,这是为什么啊,怎么解决呢 解决方案 jdbc:mysql://127.0.0.1:3306/yourdb?useUnicode=true&characterEncoding=UTF8″ 类似这个,修改下编码字符. 解决方案二: 如果用的是mysql就在网上查一下如何修改数据库编码就可以了: 如果回答对您有帮助,请采纳 解决方案三: 这是编码格式问题,转换一下文字编码就行了.比如: 已有字符