为什么autoboxed整数和.getClass()值== - 相等,不仅.equals() - 相等?

yap*_*m01 4 java equals

也许我在Java上工作太久而没有真正理解它的一些基础知识.
我明白这==是对象引用相等,.equals()是对象值相等.

  1. 比较Integers:

    Integer x = 1, y = 1;  
    System.out.println(x == y); // true
    
    Run Code Online (Sandbox Code Playgroud)

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

  2. 比较getClass()返回值:

    String s1 = "a", s2 = "b";  
    System.out.println(s1.getClass() == s2.getClass()); // true 
    
    Run Code Online (Sandbox Code Playgroud)

    为什么?再次如上所述,使用对象引用.两者都getClass将返回单独的Class对象.

我是否遗漏了某些东西,或者我的思绪是否厌倦了Java编码?

Boh*_*ian 12

整数对象

Integer x = 1, y = 1;
System.out.println(x==y); // true, why?
Run Code Online (Sandbox Code Playgroud)

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

相反,对于范围之外byte值,比较是false:

Integer x = 999, y = 999;
System.out.println(x==y); // false
Run Code Online (Sandbox Code Playgroud)

类对象

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

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