首先我们知道
== 比较的是内存地址
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了。 第一次写,写的不好,见谅哈^_^