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

2024-01-15

也许我在 Java 上工作太久了,却没有真正理解它的一些基础知识。
我确实明白==用于对象引用相等并且.equals()是为了对象值相等。

  1. 比较Integers:

    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 http://download.oracle.com/javase/6/docs/api/java/lang/Integer.html的内部类,整数缓存 http://www.docjar.org/docs/api/java/lang/Integer%24IntegerCache.html。每次创建一个值为 -128 到 +127 之间的 Integer 对象时,同一个物体将被返回(而不是创建new目的)。

相反,对于值outside the 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()每个字符串的the same类对象(String.class).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐