我可以知道public class App {
public static void main(String[] args) {
String s1 = new String("str");
String s2 = new String("str");
System.err.println("why it,s "+String.valueOf(s1==s2));
int i1 = new Integer(10);
int i2 = new Integer(10);
System.err.println("why it,s "+String.valueOf(i1==i2));
}
在这里的运作方式吗?
String
}
当我比较具有相同值的两个不同==
的引用时,==
表示它们不相等,但是当我将两个整数的引用与相同值进行比较时,{ {1}}说他们是平等的。为什么会这样?
答案 0 :(得分:3)
好的,更有意义的比较是
public class App{
public static void main(String[] args) {
String s1 = new String("str");
String s2 = new String("str");
System.err.println("why it,s "+String.valueOf(s1==s2));
Integer i1 = new Integer(10);
Integer i2 = new Integer(10);
System.err.println("why it,s "+String.valueOf(i1==i2));
}
}
int
是原始的,==只会比较该值。 Integer
是一个对象,对象的==只有在指向内存中的相同位置时才为真,否则为假。对于基元(int,boolean等),==将测试该值。
int i = Integer(10)
实际上是int i = (Integer(10)).intValue()
,java只是自动执行。
编辑添加更多解释:
Java有两种类型。原始类型和类类型。基本类型只是类型的值:int基本类型就是那个,而int。没有方法或任何东西,它只是一个int。
如果你说int a = 4
,a是一个原始变量,指向包含int的内存地址。就是这样。
Class类型是一个java对象,因此Integer是一个类类型。它表示一个整数值,因此Integer a = new Integer(4)
将创建一个整数对象,并且a将指向包含新...创建的对象的内存位置
有什么不同?
好问题。在后一个例子中(new Integer(4)),这是一个整数和其他一些东西,像toString()
方法和其他一些东西。
所以,回顾一下:
基元是存储在某处内存中的值。 类是存储在某个内存中的对象,在Integer的情况下,它表示一个int,但它有一些与之相关的其他东西(即`toString()方法)。
现在,==是等效性的测试。所以int == int
检查原始值是否相同,因为这是原始类型唯一的信息。
==对象 意味着什么。由于对象指向的不仅仅是4或8或-1,因此如果对象变量将指向内存中的相同位置<= em>,则==仅返回true。如果没有,那么你就是假的。
所以:
int i = 1;
int j = 1;
Integer k = new Integer(1)
Integer l = new Integer(1)
Integer m = k;
Integer n = new Integer(k)
i == j -> true
k == l -> false
k == k -> true
k == l -> true
n == m -> false
n.intValue() == m.intValue() -> true (intValue returns a primitive type)
现在,.equals是一个测试,看看两个对象是否相等,这意味着不同的对象有不同的东西。
对于整数,如果a和b的intValue()s相同,则a.equals(b)为真。但是,如果a和b指向内存中的同一对象
,则a == b为真现在,关于一个有2个整数的对象(比如x,y坐标)。