今日在项目中偶然
发现一个问题,在权限的管理中,先取得所有的权限,再取出存在session里的权限(即个人权限),然后比较,如果有此权限则生成html代码返回页面,在开发测试时没有问题的,是由于数据量少的问题,到了实际生产时就出问题了,看代码:
.....
function buildMenuHtml(Long authorityId ,List<Authority> list)
for(Authority vo : list){
if(authorityId == vo.getPid() && authMap.catxxKey(vo.getName())){ //如果有权限
//生成菜单代码
....
}
}
...
以上的vo.getPid()取出来的是一个Long,在测试时是可以正常生成代码的。但录入数据时,到了131这个数时就出现问题了,于是,就努力甘打印出来
System.out.println(id+" "+vo.getPid());
System.out.println((id==131L)+" "+(vo.getPid()==131L));
System.out.println(id==vo.getPid());
打印的结果 为:
131 131
true true
false
竟然打印出来都是131为什么会是false?正在不解的时候,突然看到authorityId是Long类型数据来的,也就是说是一个对象,用==的话当然系唔相等啦,哎,杯具一下,竟然将这个甘基础的也忘记了。
于是想,打印出
hashcode出来看看,是否hashcode不一样的,结果,是一样的,因为用equals来比较的话也是一样的,所以hashcode也是一样,但我想要看看它们的在堆中的
内存地址又应该如何看呢?由以上代码得知,它们的内存地址一定是不一样的。于是上网搜了一翻,发现可以用这个:
System.identityHashCode(obj);
但为什么在131之前那些比较又会是一样的呢?返回 的结果是true的呢?不解....