有人能解释一下这个结果吗?
这是我的代码:
public class foo <T> {
public static void main(String[] args) {
foo Foo = new foo();
System.out.println(Foo.compare(100L, 100));
System.out.println(Foo.compare(100L, 100L));
System.out.println(Foo.compare(127L, 127L));
System.out.println(Foo.compare(128L, 128L));
System.out.println();
System.out.println(System.getProperty("java.vendor"));
System.out.println(System.getProperty("java.version"));
}
public boolean compare( T val1, T val2) {
return ( val1 == val2 ) ? true : false;
}
}
结果是:
false
true
true
false
Sun Microsystems Inc.
1.6.0_26
首先:
这很奇怪,因为我只声明了一个模板类“T”。第一个比较结果为false,因为val1是long,val2是int(我已经通过debuger进行了检查)。但不应该是这样,因为我只声明了一个模板类,并且两个模板类都是相同的。
和
第二:
为什么每个大于127的“长”大数都不相等??
谢啦!
由于T是一个对象而不是一个基元,因此需要使用等于而不是等于来执行相等检查:
public static void main(String[] args) {
foo Foo = new foo();
System.out.println(Foo.compare(100L, 100));
System.out.println(Foo.compare(100L, 100L));
System.out.println(Foo.compare(127L, 127L));
System.out.println(Foo.compare(128L, 128L));
System.out.println();
System.out.println(System.getProperty("java.vendor"));
System.out.println(System.getProperty("java.version"));
}
public boolean compare( T val1, T val2) {
return ( val1.equals(val2) ) ? true : false; // use equal instead
}
这给你:
false
true
true
true
第一个false
是由它的两个输入的类型不相同这一事实引起的,因此存在导致它们不同的底层转换。
第一次比较最终为false,因为val1是long,val2是int(我已经通过调试器检查过了)。但它不应该是,因为我只声明了一个模板类,并且两者都是相同的。
因为,您正在使用foo-foo=new-foo()
而不是
foo
为什么每个大于127的“长”大数都不相等??
因为,您是在比较行val1==val2中变量的引用,而不是这些变量所指向的对象中包含的值。
现在,我想提出一个问题:
为什么每个
long
小于number127
和大于-128
是相等的?
因为JLS5.1.7
如果要装箱的值p为true、false、一个字节或一个字符,范围在\u0000到\u007f之间,或一个int或短数字,范围在-128到127之间(包括128和127),则让r1和r2为p的任意两个装箱转换的结果。r1==r2的情况总是如此。
在您的比较函数中,您正在比较引用而不是值(==运算符总是比较引用,除非它是内置类型。请参阅这篇文章Java中==vs equals()之间的区别是什么?)。
当您使用泛型时,您的内置类型被打包到java类中(例如Integer)。
一般来说,这段代码会给出所有的false,但在本例中,在第2个和第3个示例中为true,因为java编译器缓存范围为[-128,127]的数字,因为它们经常被使用,所以它们在内存中的地址相同。
我有一个类,声明如下:comparator: 搜索功能不转换条件: 你能帮忙吗? 翻译错误: main.cpp:101:44:从这里实例化 main.cpp:55:13: 错误: 与调用 '(const std::equal_to) 不匹配(const std::p air
本文向大家介绍Python通过`is`与`==`比较,包括了Python通过`is`与`==`比较的使用技巧和注意事项,需要的朋友参考一下 示例 常见的陷阱是混淆相等比较运算符is和==。 a == b比较的值a和b。 a is b将比较认同的a和b。 为了显示: 基本上,is可以视为的简写。id(a) == id(b) 除此之外,还有一些运行时环境的怪癖使事情变得更加复杂。True与相比,短字符
我的代码超时了,因为它效率低下。程序接受一行n个整数。每对连续的整数代表一个点(x,y)。这是一个输入示例: -5 -10 20 25 30 2 -1 -40 输出: 我有代码来排序所有的点。它们从最小到最大排序。如果"x"值相等,则检查y值。问题是:我需要计算一个点比其他点(x和y)大多少倍。所以在上面的例子中,答案是4。 > 第三点比第一点和第二点大。 结果是4。 如果点相等,也增加计数器。
问题内容: 我有以下模板: 我在执行模板时传递了一个字符串。 但是,出现以下错误: 如何比较模板中的字符串? 问题答案: 是函数,而不是运算符。它以以下形式调用:(不是)。 您可以通过将操作数从的侧面移动到之后来修复模板:
问题内容: 我试图以递归方式将本地主机中的目录与远程linux机器中的目录进行比较。但是,当我执行下一条命令时: 说这是行不通的: 差异:ssh admin@10.0.0.10:/ home / admin:没有这样的文件或目录 递归比较目录内容的正确方法是什么? 提前致谢 问题答案: 如果不需要区分文件中的详细信息,只需获取目录/文件名的差异,然后尝试以下操作: (注意:需要设置“没有密码的SS
过滤出数组中比较函数不返回 true 的所有值。 类似于difference ,除了接受一个 comparator (比较函数)。 使用 Array.filter() 和 Array.findIndex() 来查找合适的值。 const differenceWith = (arr, val, comp) => arr.filter(a => val.findIndex(b => comp(a, b