String和Integer的== 和 equals区别

首先我们知道
== 比较的是内存地址
equals 比较的是值内容
知道这个区别之后我们在来看看具体比较

String i = "abc";
String j = "abc";
String k = new String("abc");
System.out.println(i==j);//true
我们知道==不是比较内存地址吗?为什么这边答案却是true呢,不是应该false吗?
这就是另外一个区别了,在内存中有一块字符串常量池用来装字符串的,如果不是new 出来的字符串都是放在这里的,
第一次声明i变量时,会去常量池中检查有没有 "abc" 这个字符串,如果有,则直接返回引用,如果没有则创建一个再返回引用,
这也就能说的通了,因为 i 和 j 变量都不是new 出来的,所以都是在常量池中,第二次声明 j 变量时,已经存在 "abc" 了,所以
直接返回引用,也就是 i 和 j 都是指向同一个 abc 这个地址了


System.out.println(i==k);//false

再来看看这个,因为  k 变量这个是 new 出来的字符串,所以他存在堆内存中,而 i 则存在常量池中,内存地址自然也就不一样了,所以为false

System.out.println(i.equals(j));//true
System.out.println(i.equals(k));//true

因为 i ,j ,k 三个变量值都为 "abc" ,而equals 是比较值内容的,所以都为true

我们再来看看int的

int a = 100;
int b = 100;
System.out.println(a==b);//true
int 是基本类型,所以毫无疑问直接比较值,为true

int c = 100;
Integer d = 100;
System.out.println(c==d);//true
c 基本类型 d引用类型,两者比较Integer会自动拆箱成基本类型,所以这两个也是比较值内容,也为true 

Integer e = 100;
Integer f = 100;
System.out.println(e==f);//true
System.out.println(e.equals(f));//true

Integer j = 200;
Integer h = 200;
System.out.println(j==h);//false
这两块一起说:接下来重点来了,e ,f ,j ,h 都是引用类型呀,怎么回事?一个为true一个为false?
是不是有点丈二摸不着头脑一样?
这里有一个区别,在java中,Integer有一个缓存,直接声明赋值时,会检查一下这个值是不是在-128 到 127之间,如果是的话,
那么直接返回缓存引用,这里 e ,f 的值都为100,所以返回的都是同一个缓存引用,也就明白了,为什么会为true了,
而 j ,h 的值为200,并不在这个缓存区间,所以就会去在堆内存中分别创建两个Integer对象, 所以内存地址也就不一样了,所以为false

Integer k = new Integer(100);
Integer l = new Integer(100);
System.out.println(k==l);//false
System.out.println(k.equals(l));//true

Integer m = new Integer(200);
Integer n = new Integer(200);
System.out.println(m==n);//false
System.out.println(m.equals(n));//true

因为 k ,l ,m ,n 都是用new 出来的对象,所以不管他们的值是不是 -128 到 127之间,都在堆内存各自的对象,都为false,

而equals比较的是值,所以都为true了。 第一次写,写的不好,见谅哈^_^

发布了5 篇原创文章 · 获赞 0 · 访问量 122

猜你喜欢

转载自blog.csdn.net/u012939253/article/details/102812793