Java 通用对象数值比较方法
前言
请各大网友尊重本人原创知识分享,谨记本人博客:南国以南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记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!
Java 通用对象数值比较方法的更多相关文章
- java 类对象四种方法加载方式
public static void main(String[] args) throws Exception { //第一种 //这里需要做异常处理,或的加载类的类对象类. Class<?&g ...
- java Object对象的clone方法
参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎 ...
- java 通用对象排序
一个排序类,一个排序util? no.no.no…… 使用反射机制,写了一个通用的对象排序util,欢迎指正. 实体类: package entity; public class BaseTypeEn ...
- Java中对象比较的方法
class Person{ private String name; private int age; public Person(String name,int age){ this.name = ...
- Java SimpleDateFormat对象的parse方法处理12点变成00点
原文链接:https://blog.csdn.net/chenbetter1996/article/details/82812959 new SimpleDateFormat("格式&quo ...
- Java编程小技巧(1)——方法传回两个对象
原文地址:Java编程小技巧(1)--方法传回两个对象 | Stars-One的杂货小窝 题目是个伪命题,由Java语法我们都知道,方法要么返回一个对象,要么就不返回 当有这样的情况,我们需要返回两个 ...
- 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)
本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...
- 第五课 JAVA反射获取对象属性和方法(通过配置文件)
Service1.java package reflection; public class Service1 { public void doService1(){ System.out.print ...
- Ubuntu 14.04下 Java通用安装方法
参考: 解决Floodlight1.2+Mininet问题及使用安装 Ubuntu下安装JDK1.7图文详解 Ubuntu 14.04下 Java通用安装方法 1.到oracle官网下下载对应jdk包 ...
- 两种计算Java对象大小的方法
之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...
随机推荐
- delphi Wmi 获取操作系统信息
uses ActiveX, ComObj; function GetWMIProperty(WMIProperty: string): string; var Wmi, Objs, Obj: OleV ...
- 原生 JS 实现 HTML 转 Markdown ,(html2md.js 或 html2markdown.js)
之前因为一些需要,需要转换部分 HTML 标签成 markdown 格式,但是不知不觉就完善到一个相对完整的函数. 然后我就封装成了一个文件放在了 github ( https://github.co ...
- Docker 初始镜像 scratch
初识 scratch 有那么一天,我们在这里邂逅了镜像scratch... 先来搜索下这个镜像 docker search scratch NAME DESCRIPTION STARS OFFICIA ...
- leetcode每日一题:数组美丽值求和
引言 今天的每日一题原题是2278. 字母在字符串中的百分比,直接模拟,逐个匹配,统计letter在原始字符串s中出现的次数,然后再计算所占百分比即可.更换成前几天遇到的更有意思的一题来写这个每日 ...
- leetcode每日一题:使所有字符相等的最小成本
题目 2712. 使所有字符相等的最小成本 给你一个下标从 0 开始.长度为 n 的二进制字符串 s ,你可以对其执行两种操作: 选中一个下标 i 并且反转从下标 0 到下标 i(包括下标 0 和下标 ...
- 手写数字识别实战教程:从零实现MNIST分类器(完整代码示例)
引言:数字识别的魔法世界 在人工智能的奇妙宇宙中,手写数字识别堪称经典中的经典.这个看似简单的任务--让电脑像人一样"认数字",背后蕴含着模式识别的核心思想.本文将带领你亲手实现一 ...
- IDEA构建Maven项目生成的文件说明(.mvn、mvnw、mvnw.cmd、.gitignore、.iml、.idea、pom.xml)
IDEA构建的maven+springBoot项目结构如下: 1..gitignore:分布式版本控制系统git的配置文件,意思为忽略提交 在 .gitingore 文件中,遵循相应的语法,即在每一行 ...
- chrony时间同步软件介绍
本文分享自天翼云开发者社区<chrony时间同步软件介绍>,作者:刘****苏 chrony是网络时间协议NTP的通用实现,它可以将系统时钟和`NTP服务器同步.它支持在各种条件下包括间歇 ...
- JDBC-增删查改操作
使用场景:测试家族族长分成时需要批量添加家族流水记录,但手动添加和SQL语句添加较为麻烦 操作步骤 运行环境:Java8+IDEA 1.打开IDEA 点击File->New->Projec ...
- 🎀在线设计平台-mastergo
简介 MasterGo是一款面向现代团队的专业在线UI/UX设计平台,它支持界面设计.交互原型制作.设计系统管理和团队协作等功能.这款工具旨在提升设计师的工作效率,并促进团队成员之间的高效沟通与合作. ...