java中比较Integer, Long, Float, Boolean等包装类封装的基本数据类型时候碰到的坑

bug代码1


public boolean func1() {
	int i1 = 1;
	int i2 = 2;
	if (i1 == i2) {
		logger.info("true");
	} else {
		logger.info("false");
	}
}

// 含坑的代码
public boolean func2() {
	Integer i1 = 1;
	integer i2 = 2;
	if (i1 == i2) { // 重点
		logger.info("true");
	} else {
		logger.info("false");
	}
}

public boolean func3() {
	Integer i1 = 1;
	integer i2 = 2;
	if ((int)i1 == (int)i2) { // 重点
		logger.info("true");
	} else {
		logger.info("false");
	}
}

运行以上三个函数,打印结果分别是true, false和true.

问:为什么func2的执行结果是false不是1,
答:这是因为这里的i1和i2都是引用数据类型,使用 “==” 这个运算符比较的是他们的内存地址,而不是数值。 所以如果我们想要使func2返回true就要在使用 “==” 前对i1和i2进行基本的数据类型转换。

bug代码2

// case1
public Long func1() {
	Map<Long, Long> map = new HashMap<>();
	map.put(1L, 1L); // 这里的key,value必须是long/Long型数据
	map.put(2L, 2L); // 这里的key,value必须是long/Long型数据
	return map.get(1);
}

在这里插入图片描述

问:为什么case1的map.get(1)返回的是null对象,而不是1呢?
答;这是因为map.get(1)的数值是int类型而不是long/Long类型,int类型占32位而long型占64位,这就决定了输入到map中的比特数不一样,则哈希后得到的值也不同

改进后的代码:将map.get()的输入参数强制转为long类型的数据

// case2
public Long func1() {
	Map<Long, Long> map = new HashMap<>();
	map.put(1L, 1L); // 这里的key,value必须是long/Long型数据
	map.put(2L, 2L); // 这里的key,value必须是long/Long型数据
	return map.get(1L);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值