gpt4 book ai didi

java - 为什么自动装箱的整数和 .getClass() 值 == 相等,而不仅仅是 .equals() 相等?

转载 作者:搜寻专家 更新时间:2023-11-01 01:18:35 28 4
gpt4 key购买 nike

也许我在 Java 上工作的时间太长而没有真正理解它的一些基础知识。
我确实理解 == 用于对象引用相等,而 .equals() 用于对象值相等。

  1. 比较整数:

    Integer x = 1, y = 1;  
    System.out.println(x == y); // true

    为什么?由于使用了对象引用相等性,因此它们应该是 false,因为它们都是不同的对象。

  2. 比较 getClass() 返回值:

    String s1 = "a", s2 = "b";  
    System.out.println(s1.getClass() == s2.getClass()); // true

    为什么?同样按照上面的方法,使用了对象引用。两者都使用 getClass 将返回单独的 Class 对象。

我是不是漏掉了什么,或者是我对 Java 编码感到厌倦了?

最佳答案

整数对象

Integer x = 1, y = 1;
System.out.println(x==y); // true, why?

发生这种情况是因为对于 byte 范围(-128 到 +127)中的值,java 使用缓存的 Integer 对象,存储在 Integer 中的内部类,IntegerCache .每次创建值介于 -128 和 +127 之间的 Integer 对象时,将返回相同的对象(而不是创建对象)。

相反,对于 byte 范围内的值,比较结果为 false:

Integer x = 999, y = 999;
System.out.println(x==y); // false

类对象

String s1 = "a", s2 = "b";
System.out.println(s1.getClass() == s2.getClass()); // true. Why?

这是真的,因为两个对象的 class 都是 String,并且每个 JVM 每个类对象只有一个副本(就像一个单例)。从每个字符串的 getClass() 返回的类对象相同类对象 (String.class)。

关于java - 为什么自动装箱的整数和 .getClass() 值 == 相等,而不仅仅是 .equals() 相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7464340/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com