Number128增加hash和equals方法

This commit is contained in:
Looly 2023-03-30 23:39:47 +08:00
parent 98ece759a0
commit 838dcb7d3c
4 changed files with 66 additions and 4 deletions

View File

@ -2,12 +2,14 @@
# 🚀Changelog
-------------------------------------------------------------------------------------------------------------
# 5.8.17.M1 (2023-03-29)
# 5.8.17.M1 (2023-03-30)
### 🐣新特性
* 【core 】 SerializeUtil.deserialize增加白名单类避免RCE vulnerabilityissue#3021@Github
* 【poi 】 ExcelWriter在关闭后不清空currentRow以便复用issue#3025@Github
* 【core 】 完善HttpStatus参考相关规范补全缺失的状态码pr#968@Gitee
* 【core 】 NumberUtil增加pr#968@Gitee
* 【core 】 Number128增加hash和equals方法pr#968@Gitee
### 🐞Bug修复
* 【core 】 CollUtil.split优化切割列表参数判断避免OOMpr#3026@Github

View File

@ -1,5 +1,7 @@
package cn.hutool.core.lang.hash;
import java.util.Objects;
/**
* 128位数字表示分高位和低位
*
@ -87,4 +89,19 @@ public class Number128 extends Number {
public double doubleValue() {
return longValue();
}
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) {
return false;
}
final Number128 number128 = (Number128) o;
return lowValue == number128.lowValue && highValue == number128.highValue;
}
@Override
public int hashCode() {
return Objects.hash(lowValue, highValue);
}
}

View File

@ -13,6 +13,7 @@ import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Collection;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
/**
@ -113,6 +114,12 @@ public class NumberUtil {
* 提供精确的加法运算<br>
* 如果传入多个值为null或者空则返回0
*
* <p>
* 需要注意的是在不同Locale下数字的表示形式也是不同的例如<br>
* 德国荷兰比利时丹麦意大利罗马尼亚和欧洲大多地区使用`,`区分小数<br>
* 也就是说在这些国家地区1.20表示120而非1.2
* </p>
*
* @param v1 被加数
* @param v2 加数
* @return
@ -125,6 +132,12 @@ public class NumberUtil {
* 提供精确的加法运算<br>
* 如果传入多个值为null或者空则返回0
*
* <p>
* 需要注意的是在不同Locale下数字的表示形式也是不同的例如<br>
* 德国荷兰比利时丹麦意大利罗马尼亚和欧洲大多地区使用`,`区分小数<br>
* 也就是说在这些国家地区1.20表示120而非1.2
* </p>
*
* @param values 多个被加值
* @return
* @since 4.0.0
@ -1871,6 +1884,31 @@ public class NumberUtil {
return num1 == num2;
}
/**
* 比较数字值是否相等相等返回{@code true}<br>
* 需要注意的是{@link BigDecimal}需要特殊处理<br>
* BigDecimal使用compareTo方式判断因为使用equals方法也判断小数位数如2.0和2.00就不相等<br>
* 此方法判断值相等时忽略精度的即0.00 == 0
*
* <ul>
* <li>如果用户提供两个Number都是{@link BigDecimal}则通过调用{@link BigDecimal#compareTo(BigDecimal)}方法来判断是否相等</li>
* <li>其他情况调用{@link Number#equals(Object)}比较</li>
* </ul>
*
* @param number1 数字1
* @param number2 数字2
* @return 是否相等
* @see Objects#equals(Object, Object)
* @since 5.8.17
*/
public static boolean equals(final Number number1, final Number number2) {
if (number1 instanceof BigDecimal && number2 instanceof BigDecimal) {
// BigDecimal使用compareTo方式判断因为使用equals方法也判断小数位数如2.0和2.00就不相等
return equals((BigDecimal) number1, (BigDecimal) number2);
}
return Objects.equals(number1, number2);
}
/**
* 比较大小值相等 返回true<br>
* 此方法通过调用{@link BigDecimal#compareTo(BigDecimal)}方法来判断是否相等<br>
@ -2548,6 +2586,12 @@ public class NumberUtil {
* 将指定字符串转换为{@link Number} 对象<br>
* 此方法不支持科学计数法
*
* <p>
* 需要注意的是在不同Locale下数字的表示形式也是不同的例如<br>
* 德国荷兰比利时丹麦意大利罗马尼亚和欧洲大多地区使用`,`区分小数<br>
* 也就是说在这些国家地区1.20表示120而非1.2
* </p>
*
* @param numberStr Number字符串
* @return Number对象
* @throws NumberFormatException 包装了{@link ParseException}当给定的数字字符串无法解析时抛出

View File

@ -7,7 +7,6 @@ import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.map.MapUtil;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.function.Supplier;
@ -53,8 +52,8 @@ public class ObjectUtil {
* @see Objects#equals(Object, Object)
*/
public static boolean equal(Object obj1, Object obj2) {
if (obj1 instanceof BigDecimal && obj2 instanceof BigDecimal) {
return NumberUtil.equals((BigDecimal) obj1, (BigDecimal) obj2);
if (obj1 instanceof Number && obj2 instanceof Number) {
return NumberUtil.equals((Number) obj1, (Number) obj2);
}
return Objects.equals(obj1, obj2);
}