Integer和String 相等判断
Integer
Integer 有一个缓存,范围为-128~127,Integer i1 = 10,在字节码中实质是调用了Integer.valueOf,在此范围内返回的就是IntergerCache中的Integer对象,否则会返回新的Integer对象
举例:
-
当变量
i1
和i2
在缓存范围内,使用的是内部缓存数组中的同一个对象,返回true
Integer i1 = 10; Integer i2 = 10; System.out.println(i1 == i2);//true
-
当
i3
和i4
不在缓存范围内,他们是两个对象,返回false
,此时 缓存中没有,所以只能自行产生新对象:Integer i3 = 128; Integer i4 = 128; System.out.println(i3 == i4);//false
-
Integer x = 5 与 int y =5 的相等判断,返回True(因为有自动拆箱的操作):
Integer x = 5;//调用Integer.valueOf 从数组中返回 int y = 5; // 基本数据5 System.out.println(x == y);//true
Integer x = 5;调用了调用
Integer.valueOf
从数组中返一个Integer对象。然后 y 是 基本数据类型的 5。
x = = y x == y x==y 的比较虽然表面看是引用类型和基本类型的比较,但是 x会自动拆箱为基本数据类型,最终的比较就是x和y的值进行的比较,显然相等,true
String
例子1:
-
str是通过
StringBuilder
通过append
拼接之后toString
返回的一个字符串,而StringBuilder
的toString
实质上就是new了一个String (并且使new 在堆中,而非常量池中) -
str1是通过字面量方式加载到内存,保存到局部变量表中
-
所以结果为:str 不等于 str1(可以从存储的地方分析)
String str = new String("hello") + new String("world"); String str1 = "helloworld"; System.out.println(str == str1);//false
举例2:
-
两个new的String是不相等的
String str2 = new String("helloworld"); System.out.println(str == str2);//false