==
作用:
比较==两边值是否相等
不同情况下:
基本数据类型: 直接比较大小,大小相等即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

浙公网安备 33010602011771号