==

作用:

  比较==两边值是否相等

不同情况下:

  基本数据类型: 直接比较大小,大小相等即true(不能和boolean类型数据相比)

  String :
    1) 字面量:字面量赋值的String,值会存储在字符串常量池中,此时引用指向的就是在字符串常量池中的地址,如果两边值相等,那么指向的是常量池中的同一个地址,则返回true
    2) new String()对象:此时引用指向的是在堆中创建的String对象,只要两边引用指向的String对象不是同一个,则返回false
    3) 如果一边是字面量,一边是new String()对象:此时为false

  包装类:

    Byte, Short, Character,Integer,Long, Boolean 这些类中存在 缓存数组

static final Character cache[] = new Character[127 + 1];
static final Byte cache[] = new Byte[-(-128) + 127 + 1];
static final Short cache[] = new Short[-(-128) + 127 + 1];
static final Long cache[] = new Long[-(-128) + 127 + 1];

static final Integer cache[];
cache = new Integer[(high - low) + 1]; //high = 127 low = -128
int j = low;
for(int k = 0; k < cache.length; k++)
  cache[k] = new Integer(j++);

 

    如果使用字面量为包装类对象赋值 Boolean b = true; 底层字节码则是 Boolean b = Boolean.valueOf(true)

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

 

    如果包装类和对应的基本数据类型比较 Integer i1 = 128; int i2 = 128; sout(i1 == i2); 底层源码是:if(i1.intValue == i2)

public int intValue() {
    return value;
}

 

  总结包装类
    Float和Double(两边都是包装类) :
      无论使用字面量赋值还是使用new对象赋值,最终都会在堆中创建一个对象,引用指向那个对象,所以只有两边都指向同一个对象时才返回true


    其余包装类 :
      如果使用字面量赋值,在初始化包装类时<cliniit>(),会创建缓存数组,最后调用valueOf()方法为包装类赋值。此时无论多少次赋值,指向的都是同一个缓存中的对象
      如果使用new赋值,则是直接在堆类创建一个新的对象
      所以:
        1) 如果两边都是字面量赋值,那么最后返回true 【特殊情况 Integer:缓存中只有[-128,127],如果字面量大于127或小于-128,那么就会在堆内创建一个新的对象,此时指向的不是堆内同一个对象,将返回false】
        2) 如果两边都是new赋值或者一边字面量一边new,那么代表指向的对象不会是同一个,则返回false


    所有包装类共性:
      如果==两边,一边是包装类,一边是基本数据类型时:
      此时底层会调用包装类的xxxValue()【例 intValue()】,此时获取到的value属性值与基本数据类型值比较,值相等即返回true。此时不用考虑缓存机制


  其它类对象
    只有引用指向堆中同一个对象,那么结果才为true

posted @ 2021-04-11 17:03  樱花葬礼  阅读(439)  评论(0)    收藏  举报