- 关于 ==
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
对于基本类型和引用类型 == 的作用效果是不同的:
基本类型:比如 byte, short, char, int, long, float, double, boolean, 他们比较的是他们的值;
引用类型:比较的是他们在内存中的存放地址,更准确的说,是堆内存地址
如果是具体的阿拉伯数字的比较,值相等则为true,如: int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆。
- 关于 equals
equals一般意义上是比较的是两个对象的内容是否相等,如String类中equals。但是由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行重写的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
String s="abcd"是一种非常特殊的形式,和new 有本质的区别。它是java中唯一不需要new 就可以产生对象的途径。以String s="abcd";形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在压缩堆中。这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"abcd",下一次如果有String s1 = "abcd";又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象. 而String s = new String("abcd");和其它任何对象一样.每调用一次就产生一个对象,只要它们调用。
如果觉得文章对你有帮助,欢迎关注微信公众号:小牛呼噜噜
补充:任何非空的引用值X,x.equals(null)的返回值一定为false 。
public class test1 { public static void main(String[] args) { String a = new String("abcd"); // a 为一个引用 String b = new String("abcd"); // b为另一个引用,对象的内容一样 String aa = "abcd"; // 放在常量池中 String bb = "abcd"; // 从常量池中查找 if (aa == bb) // true System.out.println("aa==bb"); if (a == b) // false,非同一对象 System.out.println("a==b"); if (a.equals(b)) // true System.out.println("aEQb"); } }
- 源码
java equals 的源码:
public boolean equals(Object obj) { return (this == obj); }
String类中equals的重写
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
重写 equals 方法,一般须重写 hashCode 方法,感兴趣可看文章
- 再举个代码示例:
String x = "hello"; String y = "hello"; String z = new String("hello"); System.out.println(x==y); // true System.out.println(x==z); // false System.out.println(x.equals(y)); // true System.out.println(x.equals(z)); // true
因为 x 和 y 指向的是同一个引用,所以 == 也是 true,而 new String()方法则重写开辟了内存空间,所以 == 结果为 false,而 equals 比较的一直是值,所以结果都为 true。
也可以这么理解: String str = "hello"; 先在内存中找是不是有"hello"这个对象,如果有,就让str指向那个"hello".如果内存里没有"hello",就创建一个新的对象保存"hello". String str=new String ("hello") 就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"。
简单总结一下 :== 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;而 equals 默认情况下是引用比较,只是很多类重新了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
参考:https://www.cnblogs.com/Eason-S/p/5524837.html
本篇文章到这里就结束啦,如果喜欢的话,多多支持,欢迎关注!