我读到BigDecimal.equals的Java博士说:
将此BigDecimal与指定的对象进行相等比较。与compareTo不同,此方法仅当两个BigDecimal对象的值和比例相等时才认为它们相等(因此,使用此方法进行比较时,2.0不等于2.00)。
但是当我测试它时,不知何故我得到了意想不到的结果,BigDecimal(2.0)
等于BigDecimal(2.00)
。我想,出于同样的原因,当我把BigDecimal(2.0)
和BigDecimal(2.00)
放在HashSet
中时,大小为1,而我预期大小为2。请看下面的代码,如果有人能指出我是否遗漏了什么?
import java.math.BigDecimal;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class CollectionTest {
public static void main(String[] args) {
System.out.println(new BigDecimal(2.0).compareTo(new BigDecimal(2.00))); // 0
System.out.println(new BigDecimal(2.0).equals(new BigDecimal(2.00))); // true -- ** UNEXPECTED **
HashSet<BigDecimal> hashset = new HashSet<>();
Set<BigDecimal> treeset = new TreeSet<>();
hashset.add(new BigDecimal(2.0));
hashset.add(new BigDecimal(2.00));
treeset.add(new BigDecimal(2.0));
treeset.add(new BigDecimal(2.00));
System.out.println("hashset.size(): " + hashset.size()); // 1 -- ** UNEXPECTED **
System.out.println("treeset.size(): " + treeset.size()); // 1
}
}
在编译时,double
s2.0
和2.00
是相同的。您需要一个字符串
。喜欢
System.out.println(new BigDecimal(2.0).equals(new BigDecimal("2.00")));
输出
false
您当前的代码相当于
System.out.println(2 == 2.00);
这显然是正确的。
要扩展最后一个例子,请考虑
BigDecimal a = new BigDecimal(2.0);
BigDecimal b = a.setScale(2);
System.out.printf("%s equals %s is %s%n", a, b, a.equals(b));
这应该解释为什么您当前的代码会有这样的行为;因为
2 equals 2.00 is false
} ========================================================================================== 我希望HashSet调用equal方法,因为重写了hashCode。在equals compare之后,我想删除我要传递到hashSet的集合中的重复项。 在控制台中,它将我打印出来,为true(因为在equals
当使用and这两个都创建不同的String对象吗?我知道如果我使用它使用s1的相同对象,但在s2的情况下也使用相同的对象吗?如果是这样,那么为什么使用不同的对象。因为如果我做它返回false; 我对等于方法的理解是,它比较两个引用是否引用同一个对象,除非我们重写了等于方法,如果我的理解是错的,请告诉我。
这是我的代码: 我知道表示引用,表示包含。 现在为什么<code>a。等于(b)为假? 它们中的每一个都具有相同的值。
我12哟,我学习Java,我想做如果语句时,它是超过1和小于或等于4,或只是2和4之间,但它不工作。我试过了 <代码>如果(4 它显示了这个错误
我有下面的火药结构。因此,我需要根据查询 到目前为止,我已经写了这个,它只适用于一个值。我如何将两者结合起来
tl;医生:这是什么意思= 我刚刚解决了一个关于代码战的问题,在看了其他人对这个问题的共同反应后,我一直看到: