"=="和equals方法有什么区别?

版权声明:No Rain No Rainbow https://blog.csdn.net/xiangyuenacha/article/details/84140035

equals()和“==”操作用于对象的比较,检查俩对象的相等性,但是他们俩的主要区别在于前者是方法,后者是操作符。

总结:
1 一般使用比较原生类型如:boolean、int、char等等,使用equals()比较对象。
2 如果两个引用指向相同的对象
返回true,equals()的返回结果依赖于具体业务实现,一般重写equals方法时,同样重写hashcode方法,默认的equals方法实现是与“”操作一样的。
3 字符串的对比使用equals()代替
操作符

参考代码: EqualsTest

// "=="和equals测试
public class EqualsTest {
	
	public static void main(String[] args) {
		int a = 1;
		int b = 1;
		int c = 2;
		System.out.println(a == b); // true
		System.out.println(a == c); // false
		
		String s1 = new String("str"); 
		String s2 = new String("str"); 
		
		System.out.println("s1 == s2: " + (s1 == s2)); // false,比较的是内存地址,引用
		System.out.println("s1 equals s2: " + (s1.equals(s2))); // true
		
		// 对象的比较一般重写equals和hashcode方法
		Student stu1 = new Student(1, "张三");
		Student stu2 = new Student(1, "张三");
		System.out.println("stu1 == stu2 : " + (stu1 == stu2)); // false
		System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2)); // true
	}
	
	static class Student {
		private int age;
		private String name;

		public Student() {
		}

		public Student(int age, String name) {
			super();
			this.age = age;
			this.name = name;
		}

		public int getAge() {
			return age;
		}

		public String getName() {
			return name;
		}

		public void setAge(int age) {
			this.age = age;
		}

		public void setName(String name) {
			this.name = name;
		}
		
		/**
		 * 年龄和名称都相等的时候
		 */
		@Override  
	   public boolean equals(Object obj) {  
	       if (this == obj)  
	           return true;  
	       if (obj == null)  
	           return false;  
	       if (getClass() != obj.getClass())  
	           return false;  
	       Student other = (Student) obj;  
	       if (age != other.age)  
	           return false;  
	       if (name == null) {  
	           if (other.name != null)  
	               return false;  
	       } else if (!name.equals(other.name))  
	           return false;  
	       return true;  
	   }  
		
		@Override  
	   public int hashCode() {
	       final int prime = 31;  
	       int result = 1;  
	       result = prime * result + age;  
	       result = prime * result + ((name == null) ? 0 : name.hashCode());  
	       return result;  
	   }     
	}
	
    
}

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;

public class EqualsTest {
	public static void main(String[] args) {
		LinkedList<Student> list = new LinkedList<Student>();
		Set<Student> set = new HashSet<Student>();
		Student stu1 = new Student(1, "张三");
		Student stu2 = new Student(1, "张三");
		System.out.println("stu1 == stu2 : " + (stu1 == stu2));
		System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2));
		list.add(stu1);
		list.add(stu2);
		System.out.println("list size:" + list.size());

		System.out.println("下面的HashSet的内容=====");
		set.add(stu1);
		set.add(stu2);
		System.out.println("set size:" + set.size());
		
		// 修改学生的年龄,hashcode的值会改变
		// 当我们将某个对象存到set中时,如果该对象的属性参与了hashcode的计算,
		// 那么以后就不能修改该对象参与hashcode计算的那些属性了,否则会引起意向不到的错误的。
		stu1.setAge(40);
		System.out.println("删除元素stu1是否成功: " + set.remove(stu1));
		System.out.println("操作删除元素后set size:" + set.size());
	}

}

猜你喜欢

转载自blog.csdn.net/xiangyuenacha/article/details/84140035