前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南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. SQL Server 中的事务管理

    SQL Server 中的事务是什么? 事务是应该作为一个单元执行的一组 SQL 语句.这意味着事务确保所有命令都成功或都不成功.如果事务中的命令之一失败,则所有命令都失败,并且在数据库中修改的任何数 ...

  2. Golang 301永久重定向

    比如我要把www.taadis.com永久重定向到taadis.com //main.go package main import ( "log" "net/http&q ...

  3. 【保姆级教程】windows 安装 docker 全流程

    一.背景 许多小伙伴在安装 Dify 或是 RagFlow 这些工具的时候,往往会遇到一个难题,那就是 Docker 的安装. 首先,我们的PC安装的绝大部分是 Windows,但众所周知的原因,Wi ...

  4. 爆肝 1 周,为我的白板工具支持了 mermaid 流程图,为 ai 生成流程图铺平道路

    朋友们好,前一段时间在博客园推荐了我的白板工具 Drawnix,得到了很多朋友的支持,非常感谢,最近 Drawnix 又有了一些重要更新,其中最实用的应该是支持 mermaid 语法的流程图了. 这是 ...

  5. Clion配置Fortran环境

    1.安装CLion 下载链接:https://www.jetbrains.com/ 下载好后安装到指定目录即可 2.安装Fortran插件 3.编写程序 1)打开CLion,新建一个Fortran项目 ...

  6. CSP - J理论(1)

    CSP-J理论(1) CSP-J理论合集跳转 目录 本目录中所有标题单击均可以快速跳转哦 一.排列组合与概率 $\ \ \ \ \ $1.排列 $\ \ \ \ \ $2.组合 $\ \ \ \ \ ...

  7. Java 的 CMS 垃圾回收流程

    Java 的 CMS 垃圾回收流程 CMS(Concurrent Mark-Sweep)垃圾回收器 是一种并发垃圾回收器,旨在减少垃圾回收时的停顿时间,适用于对低延迟要求较高的应用.CMS 主要通过并 ...

  8. iOS深色模式媒体查询css

    @media (prefers-color-scheme: dark) { body { background-color: #000; color: #fff; } }

  9. jetbrains这是作啥妖呢,用了好久都没有问题,现在这是咋了?

    rider今天更新了下2025.1 数据库驱动下载不来: 插件不能正常访问: 清理下用户的配置目录: %UserProfile%\AppData\Local\JetBrains %UserProfil ...

  10. 代码随想录第二十三天 | Leecode 39. 组合总和、40.组合总和II、131. 分割回文串

    Leecode 39. 组合总和 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 ...