前言
请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、
提示:以下是本篇文章正文内容,下面案例可供参考
说明
主要用于比较两个对象是否相等,特别处理了数值类型的比较(包括字符串形式的数值)
- 数值比较的精度处理:
通过 BigDecimal 比较字符串或数字,避免 == 或 equals 的精度问题(如 0.200 vs 0.2)。 - 类型覆盖全面:
支持 String、Number、Character 等常见类型,其他类型回退到 equals。 - 健壮性:
对非法数值字符串(如 “abc”)或不支持的类型会记录警告并返回 false。
/**
* .
* 基本数据类型比对
*
* @param obj1 内容1
* @param obj2 内容2
* @return 结果
*/
private static boolean areEqual(Object obj1, Object obj2) {
if (obj1 == null && obj2 == null) {
return true;
}
if (obj1 == null || obj2 == null) {
return false;
}
// 尝试将对象转换为BigDecimal进行比较
BigDecimal bd1 = tryConvertToBigDecimal(obj1);
BigDecimal bd2 = tryConvertToBigDecimal(obj2);
if (bd1 != null && bd2 != null) {
return bd1.compareTo(bd2) == 0;
}
// 如果无法转换为数字,使用默认的equals比较
return obj1.equals(obj2);
}
/**
* .
* 尝试将各种类型转换为BigDecimal
*
* @param obj 数值
* @return
*/
private static BigDecimal tryConvertToBigDecimal(Object obj) {
if (obj instanceof Number) {
return convertToBigDecimal((Number) obj);
} else if (obj instanceof String) {
try {
return new BigDecimal((String) obj);
} catch (NumberFormatException e) {
log.warn("[{}]:不是有效的数字字符串", obj);
return null;
}
} else if (obj instanceof Character) {
return new BigDecimal((Character) obj);
}
log.warn("[{}]:不支持的类型", obj);
return null;
}
/**
* .
* 安全转换Number为BigDecimal
*
* @param number
* @return
*/
private static BigDecimal convertToBigDecimal(Number number) {
if (number instanceof BigDecimal) {
return (BigDecimal) number;
} else if (number instanceof Double || number instanceof Float) {
return new BigDecimal(number.toString());
} else {
return BigDecimal.valueOf(number.longValue());
}
}
public static void main(String[] args) {
Map<String, Object> rcXmlMap = new ConcurrentHashMap<>();
Map<String, Object> blzXmlMap = new ConcurrentHashMap<>();
rcXmlMap.put("fieldKey", "0.200");
blzXmlMap.put("fieldKey", "0.2");
rcXmlMap.put("a", "64");
blzXmlMap.put("a", "64");
rcXmlMap.put("b", "你");
blzXmlMap.put("b", "你");
Object rcValue = rcXmlMap.get("fieldKey");
Object blazeValue = blzXmlMap.get("fieldKey");
System.out.println(areEqual(rcValue, blazeValue));
rcValue = rcXmlMap.get("a");
blazeValue = blzXmlMap.get("a");
System.out.println(areEqual(rcValue, blazeValue));
rcValue = rcXmlMap.get("b");
blazeValue = blzXmlMap.get("b");
System.out.println(areEqual(rcValue, blazeValue));
}
运行结果:
true
true
WARN - [main] c.e.c.t.process.BasicProcess:[108] - [你]:不是有效的数字字符串
WARN - [main] c.e.c.t.process.BasicProcess:[108] - [你]:不是有效的数字字符串
true
总结
我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!