也许我在Java上工作太久而没有真正理解它的一些基础知识
我理解==
用于对象引用相等,.equals()
用于对象值相等。
比较Integers
:
Integer x = 1, y = 1;
System.out.println(x == y); // true
为什么呢?由于使用了对象引用相等性,因此它们应该是假的,因为它们都是不同的对象。
比较getClass()
返回值:
String s1 = "a", s2 = "b";
System.out.println(s1.getClass() == s2.getClass()); // true
为什么呢?再次如上所述,使用对象引用。使用getClass
的任何一个都将返回单独的Class对象。
我是否遗漏了某些东西,或者我的思绪是否厌倦了用Java编码?
答案 0 :(得分:12)
Integer x = 1, y = 1;
System.out.println(x==y); // true, why?
这是因为对于byte
范围(-128到+127)中的值,java使用缓存的Integer对象,存储在Integer的内部类IntegerCache中。每次创建一个介于-128和+127之间的Integer对象时,将返回相同的对象(而不是创建 new 对象)。
相反,对于外 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
)。
答案 1 :(得分:0)
a是一个很好的问题。由于Integer
是不可变的,因此Java实现不保证您将为每个Integer获取唯一对象。 Java使用Integer
个对象池来获取小值-128到+127,因此a
和b
都引用相同的基础1
对象。
对于b,两个字符串都是相同String
类的实例。 getClass()
为每个对象返回相同的Class
对象。
答案 2 :(得分:0)
如果您还不知道,这与自动装箱/拆箱概念有关。因此,当您比较Integer
个对象时,您可以想象编译器在比较它们时会自动添加intValue()
- 因此它实际上变成了原始值比较而不是对象相等。
关于String,那是因为它比较了类/类型,它们在JVM中始终是一个(因此也是同一个)。
答案 3 :(得分:0)
您对==
和equals()
的理解是正确的。在第一种情况下,它是因为缓存。在第二种情况下,对象的类总是相同的,它不依赖于实例。如果确实如此,那将是对内存的巨大浪费。