- 浏览: 1225043 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (242)
- java (58)
- netty (14)
- javascript (21)
- commons (13)
- 读书笔记 (5)
- java测试 (6)
- database (5)
- struts2 (8)
- hibernate (6)
- english (27)
- spring (10)
- 生活 (4)
- 多线程 (4)
- 正则表达式 (1)
- 杂项 (1)
- maven (4)
- 数据库 (10)
- 学习笔记 (1)
- mongodb (1)
- 百度bcs (4)
- 云推送javasdk (2)
- webservice (3)
- IllegalAnnotationException: Two classes have the same XML type name (0)
- drools (3)
- freemarker (3)
- tomcat (1)
- html5 (2)
- mq (11)
- fastjson (3)
- 小算法 (2)
最新评论
-
longxitian:
https://www.cnblogs.com/jeffen/ ...
万恶的Mybatis的EnumTypeHandler -
asialee:
ddnzero 写道博主请问FileUtils这个类是哪个包的 ...
使用mockftpserver进行ftp测试 -
ddnzero:
博主请问FileUtils这个类是哪个包的?还是自己的呢?能放 ...
使用mockftpserver进行ftp测试 -
yizishou:
为什么会intMap.get("bbb") ...
浅谈System.identityHashCode -
liguanqun811:
感觉LogManager打开了所有的LogSegment(文件 ...
jafka学习之LogManager
今天在查看一下源代码的时候突然发现要调用这个函数的地方,其实如果从定义上面来看的话,感觉不是很明白,说句心里话,我的理解是这样的,它是根据对象的内存地址来生成的hashCode,比如想这么一个情景,一般来说我们都会重载hashCode函数,就那String类的hashCode来说吧,就是与字符串的内容有关系,如果我们new两个内容相同的string,那么内存地址肯定是不相同的,那么怎么才能得到原生的hashCode呢,这个函数就是干这个事情的。
今天其实我看到了一个自己写的数据结构,就是保存一个对象和它的引用计数的。 我看的源代码是hessian,在对象序列化的时候会统计对象的引用情况,比如说Parent类,它被Child引用,它也被GrandParent引用,那么在序列化Child和GrandParent的时候,就有一个数据结构来存储Student对象被引用的情况。所以我就顺便看了一下IdenttityIntMap的函数实现:
public class IdentityIntMap { private Object[] keys; private int[] values; private int prime; private int size; public IdentityIntMap(int size) { keys = new Object[size]; values = new int[size]; prime = findBiggestPrime(size); this.size = 0; } public int get(Object key){ int hash = System.identityHashCode(key) % prime; while(true){ Object testKey = keys[hash]; if(testKey == null){ return -1; } else if(testKey == key){ return values[hash]; } else { hash = (hash + 1) % prime; } } } public int put(Object key, int value, boolean replace) { int hash = System.identityHashCode(key) % prime; while (true) { Object testKey = keys[hash]; if (testKey == null) { keys[hash] = key; values[hash] = value; size++; if (keys.length <= 4 * size) { resize(4 * keys.length); } return value; } else if (testKey != key) { hash = (hash + 1) % prime; continue; } else if (replace) { int old = values[hash]; values[hash] = value; return old; } } } public int put(Object key, int value) { return put(key, value, true); } private void resize(int newSize) { int[] oldValues = values; Object[] oldKeys = keys; values = new int[newSize]; keys = new Object[newSize]; size = 0; prime = findBiggestPrime(newSize); for (int i = 0; i < oldKeys.length; i++) { if(oldKeys[i] != null){ put(oldKeys[i], oldValues[i], true); } } } public int findBiggestPrime(int value) { for (int i = PRIMES.length - 1; i >= 0; i--) { if (PRIMES[i] <= value) { return PRIMES[i]; } } return 2; } public static final int[] PRIMES = { 1, /* 1<< 0 = 1 */ 2, /* 1<< 1 = 2 */ 3, /* 1<< 2 = 4 */ 7, /* 1<< 3 = 8 */ 13, /* 1<< 4 = 16 */ 31, /* 1<< 5 = 32 */ 61, /* 1<< 6 = 64 */ 127, /* 1<< 7 = 128 */ 251, /* 1<< 8 = 256 */ 509, /* 1<< 9 = 512 */ 1021, /* 1<<10 = 1024 */ 2039, /* 1<<11 = 2048 */ 4093, /* 1<<12 = 4096 */ 8191, /* 1<<13 = 8192 */ 16381, /* 1<<14 = 16384 */ 32749, /* 1<<15 = 32768 */ 65521, /* 1<<16 = 65536 */ 131071, /* 1<<17 = 131072 */ 262139, /* 1<<18 = 262144 */ 524287, /* 1<<19 = 524288 */ 1048573, /* 1<<20 = 1048576 */ 2097143, /* 1<<21 = 2097152 */ 4194301, /* 1<<22 = 4194304 */ 8388593, /* 1<<23 = 8388608 */ 16777213, /* 1<<24 = 16777216 */ 33554393, /* 1<<25 = 33554432 */ 67108859, /* 1<<26 = 67108864 */ 134217689, /* 1<<27 = 134217728 */ 268435399, /* 1<<28 = 268435456 */ }; }
下面的是测试方法:
public class IdentityIntMapTest { public static void main(String[] args) { IdentityIntMap intMap = new IdentityIntMap(10); String aaa = "aaa"; intMap.put(aaa, 1); intMap.put(new String("bbb"), 2); intMap.put(new String("ccc"), 3); intMap.put(new String("ddd"), 4); intMap.put(new String("eee"), 5); System.out.println(intMap.get(aaa)); System.out.println(intMap.get("bbb")); } }
当时我感觉到intMap.get("bbb")找不到,当时感觉到很奇怪,如果我吧IdentityIntMap的底层实现改成key.hashCode就可以了,但是后来想了一下这个数据结构的使用用途就是这样的我不能顺便修改,把今天的发现记录在这里吧。
评论
5 楼
yizishou
2017-06-19
为什么会
不是一个对象,所以肯定拿不到啦。。
所以,要么
要么
intMap.get("bbb")找不到,因为你放进去的时候放的是
intMap.put(new String("bbb"), 2);
不是一个对象,所以肯定拿不到啦。。
所以,要么
intMap.put("bbb", 2); intMap.get("bbb")
要么
String s = new String("bbb"); intMap.put(s, 2); intMap.get(s)
4 楼
asialee
2013-04-22
wushunlian 写道
bnmsmh 写道
System.identityHashCode 这个在aix平台的JDK1.7 64位环境下换算出来的hash结果为负值;这个会导致数据越界的!
为什么所有平台都返回的结果是正值,只有aix返回负值;
求解释啊!
为什么所有平台都返回的结果是正值,只有aix返回负值;
求解释啊!
,今天在android x86 4.2上也碰到了同样的问题
是的,有些操作系统确实会这样。
3 楼
wushunlian
2013-04-22
bnmsmh 写道
System.identityHashCode 这个在aix平台的JDK1.7 64位环境下换算出来的hash结果为负值;这个会导致数据越界的!
为什么所有平台都返回的结果是正值,只有aix返回负值;
求解释啊!
为什么所有平台都返回的结果是正值,只有aix返回负值;
求解释啊!
,今天在android x86 4.2上也碰到了同样的问题
2 楼
asialee
2012-08-13
bnmsmh 写道
System.identityHashCode 这个在aix平台的JDK1.7 64位环境下换算出来的hash结果为负值;这个会导致数据越界的!
为什么所有平台都返回的结果是正值,只有aix返回负值;
求解释啊!
为什么所有平台都返回的结果是正值,只有aix返回负值;
求解释啊!
你跑下这个程序,调试一下,看什么地方报错了,欢迎交流。
1 楼
bnmsmh
2012-08-13
System.identityHashCode 这个在aix平台的JDK1.7 64位环境下换算出来的hash结果为负值;这个会导致数据越界的!
为什么所有平台都返回的结果是正值,只有aix返回负值;
求解释啊!
为什么所有平台都返回的结果是正值,只有aix返回负值;
求解释啊!
发表评论
-
maven的system scope的依赖在打包的时候不出现在lib里面的解决
2017-09-20 11:21 0上周遇到一个问题,一个sytem scope的依赖,在导出的 ... -
JAVA静态代码块
2015-04-07 16:26 2002今天遇到下面的代码 ... -
StringUtils.repeat函数赏析与疑问
2014-09-01 18:43 6021今天实现一个字符串拼接的一个需求,比如: ... -
java服务的培训ppt
2014-08-30 23:01 1540给应届生培训java web 服 ... -
给新人制定的java学习计划
2014-08-30 22:52 2437花了一点时间,给团队应届生和实习生制定 ... -
获取手机的mac地址
2014-04-10 22:20 3364与IP不同,MAC是指连接WIFI使用的无线网卡的物理地址, ... -
解决errorpage里面取不到Authentication的问题
2013-01-20 23:56 2403本人原创,发现一些网站无道德的抓取 ... -
SimpleDateFormat使用的时候的注意点
2012-12-06 20:59 2023今天在帮助同事查找一个项目bug的时候发现一个很奇怪 ... -
java和javascript的正则表达式有点不同
2012-11-06 18:54 1401今天在项目中遇 ... -
velocity 1.6.4的一个bug
2012-09-10 17:24 2147$.ajax()在Velocity中会冲突, 总之 ... -
一种多数据源分页算法
2012-09-10 17:13 7499以前开发一个系统,需要去多个系统去取数据,简单期间,比 ... -
使用stringBuffer和StringBuilder拼串要注意的问题
2012-07-30 17:30 8055今天在和同事排除一个问题的时候发现,从 ... -
java获取当月的工作日
2012-05-10 12:07 6056在这个记录一下,记录java获取某个月的工作日的代码,方便以 ... -
webservice引用传参
2012-04-19 19:38 1404http://www.blogjava.net/xylz/ar ... -
java获取当天的开始时间,当前周的开始时间
2012-04-16 17:31 19546在程序里面要获取当前的开始时间和结束时间,以及当前天 ... -
edtFTPj源码学习
2012-04-11 16:25 1200下面是edtFTPj的源码学习,下面的类图都是我自己亲手花的, ... -
ftp协议研究
2012-03-12 17:34 1221ACTIVE FTP OPERATION 1、客户端使用源 ... -
西安交通大学的错误日志
2011-12-14 13:30 977西安交大的网站报错了,记录下出错日志,改天研究一下。 HT ... -
tomcat的favicon.ico的用法
2011-12-01 20:00 21941. web.xml文件添加下面的mime-mapping ... -
htmlunit模拟sso登陆
2011-07-27 14:45 6909import java.io.IOException; ...
相关推荐
System.identityHashCode 竞争条件 我们可以将 ArrayList 传递给接受 List 的方法吗? (不)如何解决? (使用通配符,例如 List<? extends Number> 以了解有关有界和无界通配符以及其他泛型问题的更多信息,请...
实现 图片的放大,缩小,左右屏幕滑动 。 直接贴代码吧。。 public class ViewPager extends ViewGroup { private static final String TAG = "ViewPager"; private static final boolean DEBUG = false;...
波士顿房价数据集Boston House Price 全网最便宜
三种实现FPGA实现UDP协议的代码工程(包括ARP、ICMP),包含使用设计文档。 第一种,米联客的DCP封装包 第二种,正点原子的源码工程 第三种,基于正点原子的赛灵思MAC核的代码工程。
Red_Hat_Enterprise_Linux-7-RPM_Packaging_Guide-en-US
Matlab 三维人脸识别系统 V 4.3.zip
信捷XD PLC MODBUS控制阀岛通信 案例程序
大家好呀!今天来介绍一款常用进制转换器,也就是 16 进制、10 进制、2 进制转换计算器。有了它,你可以轻松实现不同进制之间的快速转换。无论是将 16 进制转换为 10 进制或 2 进制,还是从其他进制转换过来,它都能准确而高效地完成。无论是在计算机编程、数字电路等领域,还是日常对进制转换有需求的时候,它都能成为你的得力小助手,让进制转换不再麻烦,快来试试吧!
这款微信小程序是一个创新的智能排队取号系统,专为提高服务行业的效率和顾客满意度而设计。它通过集成地图组件,为用户提供了一个直观、易用的排队和取号解决方案。用户可以在小程序中查看各个服务点的位置,实时了解排队情况,并进行远程取号。 小程序的主要功能包括: 实时排队信息:用户可以实时查看各个服务点的排队情况,包括当前排队人数、预计等待时间等。 远程取号:用户无需到现场即可通过小程序远程取号,节省了排队等待的时间。 地图导航:集成的地图组件可以帮助用户快速找到服务点的具体位置,并提供导航服务。 取号管理:用户可以在小程序中管理自己的取号信息,包括查看、取消等操作。 此外,小程序还支持多种场景,如餐饮、医疗、银行、政府服务等,适用于各种需要排队取号的服务场合。它不仅提高了服务效率,减少了顾客的等待时间,还为商家提供了客流管理和数据分析的工具。
520节日520节日表白神器520节日520节日表白神器520节日520节日表白神器520节日520节日表白神器
JAVA语言考试系统的设计与实现(LW+源代码+文献综述+外文翻译+开题报告)
相移法偏移MATLAB代码.zip
directx修复工具directx修复工具directx修复工具directx修复工具
基于matlab的三维地球建模,需联网.zip
字符串处理-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
参加比赛的一些心得:感觉把比赛得那一门语言基础学会,输入输出([我写的python输入输出](https://blog.csdn.net/qq_41392228/article/details/123614298)),([C++的STL](https://blog.csdn.net/qq_41392228/article/details/124825895)),熟练里面的数据结构,如数组,map等,==主要还是基础==。熟悉了后,可以在刷一下基础题,巩固哈学了的基础知识。把基础学好了,拿个奖是没问题的,正常发挥即可。想那个好的名词,就要看看相关的算法了,主要就是暴力的+优化,BFS,DFS,比较难的就是动态规划,得找转换方程。 python版本的可见:https://blog.csdn.net/qq_41392228/article/details/123616441
基于 Rust + eBPF 丢弃 GFW DNS 污染包 GFW 污染 DNS 的方式为抢答,我们只需要丢弃投毒响应即可获得正确的解析结果。通过 eBPF 我们可以在内核中插入代码,相比在用户态启动代理,这样可以获得更好的性能。 要丢弃投毒响应,重点是找到它们的特征。 以 twitter.com 为例,当向 8.8.8.8 请求 twitter.com 的 A 记录时,正常的响应会返回 2 条结果(1Q2A);而 GFW 只会返回 1 条,但是使用了 2 次抢答。2 次抢答包其中一个 IP Identification = 0x0000,另一个 IP Flags = 0x40(Don't fragment);而正常的响应 IPID 不会是 0 并且 IP Flags = 0。 我们只要 Drop 掉符合对应特征的包即可。这时我们可以验证,twitter.com 可以正确解析(fb 等非 google 服务也正常)。
分数阶傅里叶变换数字水印matlab程序.zip
“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md“互动课堂”微信小程序需求.md