为什么“==”对整数和字符串引用的工作方式不同?

时间:2015-06-21 21:36:49

标签: java equality

我可以知道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}}说他们是平等的。为什么会这样?

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坐标)。