前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南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. C# Socket教程入门,Socket的使用方法,附可执行Demo

    核心: 在服务器端和客户端的两个Socket实例,共同维持一个连接,而我们还需要一个服务端绑定了特定端口号的固定的serverSocket,用来监听远方clientSocket的申请,并为这个申请建立 ...

  2. 痞子衡嵌入式:恩智浦i.MX RT1xxx上特色外设XBAR那些事(1)- 初识

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1xxx系列上的XBAR外设. 得益于 Arm Cortex-M 内核的普及,现如今 MCU 厂商遍地开花,只要能取 ...

  3. 应用引入LLM实践

    LLM最近在各行各业遍地开花,产生了很好的效果,也落地了很多好的功能应用. 无论是从实际应用角度,还是从营销角度,我们都需要接入大模型能力. 拿国内比较火的Deepseek来说,具有良好的推理能力,可 ...

  4. C#+Selenium+Nunit实现Web自动化demo

    1.新建Nunit工程 步骤如下: 打开Rider选择图示选项 使用Nuget安装对应库 2.编写代码 代码如下: using NUnit.Framework; using OpenQA.Seleni ...

  5. IP、端口相关

    Windows端口被占用 按住[Windows+R]键输入cmd回车 输入命令[netstat -aon|findstr "端口号"]后按回车,找对最后一列对应的数字,即为这个端口 ...

  6. Quartz.Net定时任务

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

  7. edge浏览器新版,开心的扔掉chrome!还是微软更良心!windows系统全球用也没说啥!让你android能!

    直接上图吧,这下google慌了吧!微软给力呀!关键是版本直接最新的chromium!比起qq浏览器70,360浏览器78新的多了: 微软开发,质量信得过,就个人隐私之类的我更相信微软,比起googl ...

  8. Java编程--观察者(Observer)设计模式

    观察者设计模式 观察者设计模式是一种行为设计模式,允许对象在其状态改变时通知其他依赖对象.它创建了一种发布者(Subject)和订阅者(Observer)之间的依赖关系.这种模式经常用于实现事件处理系 ...

  9. 【笔记】Python3|爬虫请求 CSRF-Token 时如何获取Token、Token过期、处理 CSRF-Token 需要注意的问题及示例

      CSRF-Token 机制是 Web 应用程序中常用的安全机制,它可以防止跨站请求伪造攻击,但会给爬虫造成一定的困扰.本文将介绍在使用 Python3 爬虫时,处理 CSRF-Token 机制需要 ...

  10. 内网私仓全流程搭建记录(一)-Nexus3环境搭建

    1.部署 1)在https://help.sonatype.com/repomanager3/product-information/download中下载对应环境及版本,此处要求3以上版本,本次以& ...