1. 整型等值判断
Java中整型等值判断方法如下表所示:
类型 整型数值范围区间 创建方式 是否复用已有对象 等值判断 Integer [-128, 127] IntegerCache.cache 复用已有对象 equals方法 或 == Integer [-128, 127]区间外,整型数值范围内 在堆上创建 不复用已有对象 equals方法 int 整型数值范围内 在栈上创建 —— == 示例:
@Test public void test() { Integer num1 = 10; Integer num2 = 10; Integer num3 = new Integer(10); Integer num4 = new Integer(10); Integer num5 = 1000; Integer num6 = 1000; System.out.println(num1 == num2); System.out.println(num3 == num4); System.out.println(num5 == num6); }
结果:
分析:
- num1与num2使用都是直接将整型数值赋值给包装类,并且整型数值在[-128, 127]之间,使用IntegerCache.cache创建对象,可以复用已有对象,因此可以使用 == 进行等值判断。
- num3与num4是通过构造方法new出来的对象(该过程在堆中进行),因此它们的地址是不一样的,所以不能使用 == 进行等值判断。
- num5与num6使用都是直接将整型数值赋值给包装类,但是整型数值在[-128, 127]区间之外,在堆上创建对象,不复用已有对象,因此不能使用 == 进行等值判断。
总结:
- 由于使用Integer包装类的具体场景中经常无法判断其具体取值区间,因此建议Integer类型的等值判断采用equals方法。
2. 浮点型数值运算
由于浮点型在参与数值运算时存在精度损失,因此浮点型运算一律转为BigDecimal类型进行计算。
示例:
/** * 计算3.14 * 2.2 * */ @Test public void test() { // 使用double运算,打印结果:6.908000000000001 System.out.println(3.14d * 2.2d); // 使用BigDecimal运算,打印结果:6.908 System.out.println(new BigDecimal("3.14").multiply(new BigDecimal("2.2"))); }
分析:使用double直接运算的结果存在一定误差,而使用BigDecimal运算的结果为精确值。
BigDecimal的创建方式:
错误创建方式
// 不能在bigDecimal的构造方法里直接传入double或float类型的变量或数值,这样创建的BigDecimal对象本身存在误差 BigDecimal bigDecimal = new BigDecimal(3.14d); // 打印结果:3.140000000000000124344978758017532527446746826171875 System.out.println(bigDecimal);
正确创建方式
// 可以在bigDecimal的构造方法里传入浮点类型的字符串 BigDecimal bigDecimal1 = new BigDecimal("3.14"); BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(3.14d));
// 可以使用BigDecimal的静态方法valueOf()传入浮点型数值来创建 BigDecimal bigDecimal3 = BigDecimal.valueOf(3.14d);
3. 浮点型等值判断
浮点型等值判断分以下类型:
参与比较的两个浮点数 num1 与 num2 只包含整数部分,不包含小数部分时,可以直接使用 == 或其装箱类的equals方法进行等值判断。
当参与比较的两个浮点数 num1 与 num2 的数值中包含小数部分时,有两种方式进行等值判断。
1、判断两个浮点数 num1 与 num2 是否等值,当 num1 - num2 的绝对值在某一精度范围内时,可以认为 num1 与 num2 是等值的。
示例:
/** * 判断num1是否等于3.14 * */ public boolean test(double num) { if (Math.abs(num - 3.14d) < 1e-10d){ return true; } else { return false; } }
2、判断两个浮点数 num1 与 num2 是否等值,可以先将 num1 与 num2 转换为BigDecimal类型,在进行比较。
示例:
/** * 判断num1是否等于3.14 * */ public boolean test7(double num) { BigDecimal bigDecimal = BigDecimal.valueOf(num); if (bigDecimal.equals(new BigDecimal("3.14"))) { return true; } else { return false; } }