Java:将两个具有相同值的不同类型的对象进行比较,返回true

时间:2016-07-07 19:09:34

标签: java object compare

我有一些我需要比较的数据。我可能需要将值与不同的数据类型进行比较。这是基本上发生的事情:

Object a = (long) 1;
Object b = (int) 1;


System.out.println(Objects.equals(a, b)); //returns false

Sysout.out.println(Objects.equals(a.toString(), b.toString())); //returns true

使用.toString()似乎是一个可行的解决方案吗?或者我应该走另一条路?

编辑:

该程序正在读取HIVE表,其中某些表可能包含完全相同的数据,但数据类型不同。数据类型包括int,smallint,bigint,string,array,double,timestamp。

我并不关心数组比较,因为除了可以容纳数组的数组类型之外别无他法。但是,可以将String类型与时间戳进行比较。我也不关心int进行双重比较,因为这些应该导致错误。

任何没有小数位和不同数据类型的数值都应该与它们的值进行比较,数据类型不匹配不应该返回false。

编辑:

任何带小数的数字都会在比较前用3位小数舍入。

5 个答案:

答案 0 :(得分:1)

仅当<{strong> Thread took 44.695419 ms to start 为相同值但不同对象类型返回相同的表示时,才能使用toString

对于int和long,它可以很好如果 long保持在值范围内,可以分配int。

如果它是double和int,由于小数点等原因,任何值的子集都不会很好。

如果它们属于同一对象类型,则toString()的实现应该足够了。

根据您的使用案例,您可以创建遇到字符串的时间戳,以便与其他时间戳进行比较(如果有的话),并将这些时间戳相互比较。

由于您需要将bigint表示为long,您还可以将smallint和int值转换为long,以便您可以依赖equals方法。

答案 1 :(得分:1)

“不同类型,相同价值”的概念实际上是荒谬的。当类型与标准转换(加宽,缩小,[联合]装,字符串......)无关时,根据定义,它们不具有可比性。他们有不同的话语领域。这就像比较英镑和英镑。没有语义关系。

您可以强加任何您希望与您的可比性概念相匹配的语义关系,但这需要您将“值”以标准方式引入常见类型。 '1',(int)1,“1”和新的BigDecimal(new BigInteger(“1”),2)可能会以不同的方式变成'String',如果您认为'toString()'是您的答案,那可能是也可能不是你想要的。

因此,完全取决于您如何渲染不兼容的类型。如果它们不相容,那么你就是那个扭曲规则的人,所以你必须统治如何扭曲它们。我强烈建议您考虑一下您希望比较的域名,以及您计划处理不兼容比较的内容。

当然,兼容的比较应该只使用内置机制。

答案 2 :(得分:1)

这是一种完全按照编辑过的问题描述的比较的方法。

public static string XpathExpression(string value)
{
    if (!value.Contains("'"))
        return '\'' + value + '\'';

    else if (!value.Contains("\""))
        return '"' + value + '"';

    else
        return "concat('" + value.Replace("'", "',\"'\",'") + "')";
}

答案 3 :(得分:0)

如果您知道要比较的所有对象都是数字,您可以将它们转换为java.math.BigDecimal实例并进行比较。

Objects.equals(new BigDecimal(a.toString()), new BigDecimal(b.toString()));

答案 4 :(得分:0)

如果a和b不为空,Objects.equals(a,b)会在内部调用a.equals(b)。
a实际上是Long类型,无论你将它声明为Obect,所以根据Long a.equals(b)的文档检查b是否为long类型。这就是它返回虚假的原因 使用toString()似乎不是比较数字对象的最佳方法。
尝试使用longValue(),intValue()等方法更好地进行原始类型比较。