1. equals()用法
Java中所有的类都是继承自Object这个基类的,在Object类中定义了一个equals方法,这个方法的初始行为是比较对象的内存地址,但在一些类库中已经重写了这个方法(一般都是用来比较对象的成员变量值是否相等),比喻:String,Integer,Data等类中,所以它们不再是比较类在堆中的地址了。
Object类中源码:
1. public boolean equals(Object var1) { 2. return this == var1; 3. }
String类中重写equals的代码:
1. public boolean equals(Object var1) { 2. if (this == var1) { 3. return true; 4. } else { 5. if (var1 instanceof String) { 6. String var2 = (String)var1; 7. int var3 = this.value.length; 8. if (var3 == var2.value.length) { 9. char[] var4 = this.value; 10. char[] var5 = var2.value; 11. 12. for(int var6 = 0; var3-- != 0; ++var6) { 13. if (var4[var6] != var5[var6]) { 14. return false; 15. } 16. } 17. 18. return true; 19. } 20. } 21. 22. return false; 23. } 24. }
String类对equals方法重写,用来比较指向的字符串对象所存储的字符串是否相等。
来个示例体验一下:
1. String a = "abc";// abc在常量池中 2. String b = "abc";//栈中b指向常量池中的abc 3. String c = new String("abc");// 在堆内存中重新开辟了一个abc的空间 4. String d = c.intern();//检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。 5. 6. 7. System.out.println(a==b); //true 8. System.out.println(a.equals(b)); //ture 9. System.out.println(a==c); //false 10. System.out.println(a.equals(c)); //true 11. System.out.println(a==d); //true 12. System.out.println(a.equals(d)); //true
2. == 的用法
"关系操作符生成的是一个boolean结果, 它们计算的是操作数的值之间的关系"。 ---《Java编程思想》
java中的数据类型可以分为两类,一类是基本数据类型【byte/short/char/int/long/float/double/boolean】,一类是引用数据类型【接口/类/数组等非基本数据类型】
- ==作用于基本数据类型的变量,则直接比较其存储的“值”是否相等
- ==作用于引用类型的变量,则比较的是所指向的对象的地址
来个示例体验一下:
1. public class Main { 2. 3. /** 4. * @param args 5. */ 6. public static void main(String[] args) { 7. // TODO Auto-generated method stub 8. 9. int n=3; 10. int m=3; 11. 12. System.out.println(n==m); //true 13. 14. String str = new String("hello"); 15. String str1 = new String("hello"); 16. String str2 = new String("hello"); 17. 18. System.out.println(str1==str2); //false 19. 20. str1 = str; 21. str2 = str; 22. System.out.println(str1==str2); //true 23. } 24. 25. }
参考链接:
https://www.jb51.net/article/150691.htm
https://www.cnblogs.com/dolphin0520/p/3592500.html