前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南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 通用对象数值比较方法的更多相关文章

  1. java 类对象四种方法加载方式

    public static void main(String[] args) throws Exception { //第一种 //这里需要做异常处理,或的加载类的类对象类. Class<?&g ...

  2. java Object对象的clone方法

    参考copy链接:http://blog.csdn.net/bigconvience/article/details/25025561 在看原型模式,发现要用到clone这个方法,以前和朋友聊过,没怎 ...

  3. java 通用对象排序

    一个排序类,一个排序util? no.no.no…… 使用反射机制,写了一个通用的对象排序util,欢迎指正. 实体类: package entity; public class BaseTypeEn ...

  4. Java中对象比较的方法

    class Person{ private String name; private int age; public Person(String name,int age){ this.name = ...

  5. Java SimpleDateFormat对象的parse方法处理12点变成00点

    原文链接:https://blog.csdn.net/chenbetter1996/article/details/82812959 new SimpleDateFormat("格式&quo ...

  6. Java编程小技巧(1)——方法传回两个对象

    原文地址:Java编程小技巧(1)--方法传回两个对象 | Stars-One的杂货小窝 题目是个伪命题,由Java语法我们都知道,方法要么返回一个对象,要么就不返回 当有这样的情况,我们需要返回两个 ...

  7. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  8. 第五课 JAVA反射获取对象属性和方法(通过配置文件)

    Service1.java package reflection; public class Service1 { public void doService1(){ System.out.print ...

  9. Ubuntu 14.04下 Java通用安装方法

    参考: 解决Floodlight1.2+Mininet问题及使用安装 Ubuntu下安装JDK1.7图文详解 Ubuntu 14.04下 Java通用安装方法 1.到oracle官网下下载对应jdk包 ...

  10. 两种计算Java对象大小的方法

    之前想研究一下unsafe类,碰巧在网上看到了这篇文章,觉得写得很好,就转载过来.原文出处是: http://blog.csdn.net/iter_zc/article/details/4182271 ...

随机推荐

  1. [每日算法 - 华为机试] leetcode690. 员工的重要性

    入口 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer.https://le ...

  2. 【Python】Flask API 登录

    Flask API 登录 零.起因 最近要写uniapp客户端,服务器使用的是Python的Flask框架,为了实现用户登录,在网上查到了一些Flask的扩展,其中比较简单的就是flask_httpa ...

  3. 本地学习环境minikube安装

    有感于K8S太强大和自己的太无知,索性来系统学习下K8S.网上一番攻略,起码先得有个本地学习环境,所以安装一个minikube,下面记录安装过程,供有需要的人使用. 看看minikube架构: 我是在 ...

  4. 一步到位js/javascript对象和querystring查询字符串互转(get/url参数)

    当然,这个问题又很多解决方式,这里说一种最简洁的方式: 对象转querystring查询字符串(get/url参数) 我看网上的方法都比较繁琐,其实可以直接使用js的URLSearchParams对象 ...

  5. phpoffice php操作excel表格的导入和导出

    https://packagist.org/packages/phpoffice/phpexcel 使用: composer require phpoffice/phpexcel 控制器引入 //引入 ...

  6. Quartz.Net定时任务

    参照: [项目升级]集成Quartz.Net Job实现(一) - 腾讯云开发者社区-腾讯云 (tencent.com) Quartz分布式任务调度 - 掘金 (juejin.cn) 基本概念: Qu ...

  7. python 3 No module named ‘Crypto‘ 解决方案

    pip3 install pycryptodome pip3 install crypto Pip3 install pycrypto 本机(mac)环境的解决方案: pip3 uninstall p ...

  8. 25.9K star!AI一键生成高清短视频,这个开源神器让内容创作起飞!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 "MoneyPrinterTurbo 是基于AI大模型的全自动短视频生成工具,只需 ...

  9. STM32F407——使用systick定时器裸机制作延时函数

    准备工作: 软件:keil5 硬件:STM32F407ZET6芯片,gec6818开发板,st-link调试器 文档:<开发板原理图>,<Cortex M3与M4权威指南>,& ...

  10. 【MOOC】华中科技大学计算机组成原理慕课答案-第六章-中央处理器(一)

    单选 1 一定不属于冯•诺依曼机体系结构必要组成部分的是()(单选) A. CPU B. RAM C. ROM √D. Cache 计算机中的ROM主要是用来存储一些系统信息,或者启动程序BIOS程序 ...