==Java中对象上的运算符

==Java中对象上的运算符,java,casting,Java,Casting,我无法理解在以下代码中创建obj和obj2对象的方式的差异。特别是,我不确定如何将基本体转换为对象。看看这里的其他一些问题,我认为这是不可能的。但是下面的程序编译并运行良好。在第一种情况下,输出为false,在第二种情况下为true public class Test { public static void main(String args[]){ Integer num = new Integer(3) ; Object obj = num;

我无法理解在以下代码中创建obj和obj2对象的方式的差异。特别是,我不确定如何将基本体转换为对象。看看这里的其他一些问题,我认为这是不可能的。但是下面的程序编译并运行良好。在第一种情况下,输出为false,在第二种情况下为true

public class Test {

    public static void main(String args[]){

        Integer num = new Integer(3) ;
        Object obj = num;
        Integer[] integerArr = {1, 2, 3, 4};
        Object[] objArr = integerArr;
        boolean contains = false;

        for (int i = 0; i < objArr.length; i++){
            if (objArr[i] == obj){
                contains = true;
                break;
            }
        }

        System.out.println(contains);

        int num2 = 3 ;
        Object obj2 = num2;
        Integer[] integerArr2 = {1, 2, 3, 4};
        Object[] objArr2 = integerArr2;
        boolean contains2 = false;

        for (int i = 0; i < objArr2.length; i++){
            if (objArr2[i] == obj2){
                contains2 = true;
                break;
            }
        }

        System.out.println(contains2);
    }

}
公共类测试{
公共静态void main(字符串参数[]){
整数num=新整数(3);
对象obj=num;
整数[]integerArr={1,2,3,4};
Object[]objArr=integerArr;
布尔包含=假;
for(int i=0;i
对象之间的
==
操作符测试身份(如果两个对象完全相同),而
equals()方法测试相等性(两个对象是否具有相同的值)

大多数时候,你会对平等感兴趣。碰巧,您在问题中提供的示例实际上是有效的,因为
Integer
对象被缓存(通常在-127到127范围内,尽管这是可配置的),但是如果您使用更大的数字测试身份,测试很可能会失败

例如,这将计算为
true

Integer a = 127;
Integer b = 127;
a == b // true
然而,这将计算为
false

Integer a = 128;
Integer b = 128;
a == b // false

一句话:安全起见,始终使用
equals()
来测试对象之间的相等性。

您必须从
java.lang.Integer

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
下面是相关字节码,以查看它如何调用
整数
构造函数或
整数。valueOf

0: new #2; //class java/lang/Integer
3: dup
4: iconst_3
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: astore_1
9: aload_1
10: astore_2
11: iconst_4
12: anewarray #2; //class java/lang/Integer
15: dup
16: iconst_0
17: iconst_1
18: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
21: aastore
...
90: iconst_3
91: istore 6
93: iload 6
95: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
98: astore 7
100: iconst_4
101: anewarray #2; //class java/lang/Integer
104: dup
105: iconst_0
106: iconst_1
107: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
110: aastore
111: dup
...
0:new#2//类java/lang/Integer
3:dup
4:iconst_3
5:特别是#3//方法java/lang/Integer。“”:(I)V
8:astore_1
9:aload_1
10:astore_2
11:iconst_4
12:anewarray#2//类java/lang/Integer
15:dup
16:iconst_0
17:iconst_1
18:invokestatic#4//方法java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
21:aastore
...
90:iconst_3
91:istore 6
93:iload 6
95:invokestatic#4//方法java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
98:astore 7
100:iconst_4
101:anewarray#2//类java/lang/Integer
104:dup
105:iconst_0
106:iconst_1
107:invokestatic#4//方法java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
110:aastore
111:dup
...

在第二种情况下,您将一个原语
int
与对象
Integer
数组进行比较。JVM正在“展开”对象
Integer
,并与原语进行比较。。因此,在这种情况下,您会得到一个相等匹配


在第一种情况下,您总是将一个对象与另一个对象进行比较,在您的示例中,这些对象永远不会相等。

=如果object1和object2是引用类型,则==检查object1和object2是否都是对同一对象的引用

equals如果使用object1.equals(object2),则它会比较对象的实际值

示例:

使用String.equals(String other)函数比较字符串,而不是==运算符


函数检查字符串的实际内容,==运算符检查对对象的引用是否相等。

您很幸运<代码>整数
缓存对象以获取小值。重复,重复,重复。。现在只是找到他们。这是我能找到的票数最多的傻瓜。谢谢我知道equals方法,而且我确实使用了它,但我只是好奇为什么==在上面的一个案例中起作用。谢谢澄清@Mystical的评论。这就是我要找的。
0: new #2; //class java/lang/Integer
3: dup
4: iconst_3
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: astore_1
9: aload_1
10: astore_2
11: iconst_4
12: anewarray #2; //class java/lang/Integer
15: dup
16: iconst_0
17: iconst_1
18: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
21: aastore
...
90: iconst_3
91: istore 6
93: iload 6
95: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
98: astore 7
100: iconst_4
101: anewarray #2; //class java/lang/Integer
104: dup
105: iconst_0
106: iconst_1
107: invokestatic #4; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
110: aastore
111: dup
...