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

  • 比较Integers:
    Integer x = 1, y = 1;
    System.out.println(x == y); // true
    

    为什么?由于使用了对象引用相等,因此它们都是不同的对象,因此应该为false。
  • 比较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?
    

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

    10-04 23:16
    查看更多