当前位置: 首页 > 知识库问答 >
问题:

Java—通过模板比较长值

漆雕嘉茂
2023-03-14

有人能解释一下这个结果吗?

这是我的代码:

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的“长”大数都不相等??

谢啦!

共有3个答案

颜嘉誉
2023-03-14

由于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是由它的两个输入的类型不相同这一事实引起的,因此存在导致它们不同的底层转换。

端木昱
2023-03-14

第一次比较最终为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的情况总是如此。

景河
2023-03-14

在您的比较函数中,您正在比较引用而不是值(==运算符总是比较引用,除非它是内置类型。请参阅这篇文章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