Java基础之:equals

Java基础之:equals

"=="比较运算符

首先我们重温一下一直在使用的"=="比较运算符

1)== :比较运算符,既可以判断基本类型,又可以判断引用类型

2)== :比较运算符,如果判断基本类型,判断的是值是否相等。示例:int i=10; double d=10.0; i==d true

3)== :比较运算符,如果判断引用类型,判断的是地址是否相等.

equals方法

equals: 是Object类中的方法,只能判断引用类型,判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如Integer,String .... 直接上案例

 

简单案例

注意案例中的源码

package object;

/**
 *  equals与==的区别:
 * 		equals 与  == 相同的作用,在Object.equals没有被子类重写之前。
 *		但 equals 通常用于比较引用类型变量,==通常用于比较基本数据类型变量。
 *		不管是equals 还是 == ,比较引用类型变量时,都是比较引用地址是否相等。
 *		对于基本类型而言,equals和== 都是比较大小是否相等 
 *	Object的子类大多都会重写equals方法, 例如String ,Integer....
 *		
 */
public class ClassTest {

	public static void main(String[] args) {
		
		//查看Object中equals源码	(ctrl + 左键) 点击进入源码
		Object object = new Object();
		System.out.println(object.equals(new String("hello"))); //F
		
		/*		Object.equals 源码 :
		 *     public boolean equals(Object obj) {
        			return (this == obj);
    		   }
		 */
		String st1 = new String("hello");
		String st2 = new String("hello");
		System.out.println(st1 == st2);	//F
		
		//String 子类重写了 Object父类的 equals方法
		System.out.println(st1.equals(st2));	//T
		//使用String的equals方法比较一个对象与一个常量时,尽量使用,常量.equals
		System.out.println("hello".equals(st2)); //T   这样可以避免空指针异常
		
		// String.equals源码:
		/*
		 *  public boolean equals(Object anObject) {
        		if (this == anObject) {	//如果是同一个对象,返回true
            		return true;
        		}
        		if (anObject instanceof String) {	
        			//如果是String类型或其父类,进入if判断内容
            		String anotherString = (String)anObject;
            		int n = value.length;
            		if (n == anotherString.value.length) {
            			//如果长度相等,将两个字符串保存入char数组中,逐个字符进行比较
                		char v1[] = value;
                		char v2[] = anotherString.value;
                		int i = 0;
                		while (n-- != 0) {
                			//只要有一个字符不相同 就返回false
                    		if (v1[i] != v2[i])
                        		return false;
                    		i++;
                		}
                		return true;
            		}	
        		}
        		return false;
    		}
		 */

	}

}

  

 

 

简单案例2

package object;
/**
 *	重写equals方法,实现比较两个Person对象的所有属性是否相同,若相同返回true
 */
public class OverrideEquals {

	public static void main(String[] args) {

		Person person1 = new Person("小范",20,'A');
		Person person2 = new Person("小范",20,'A');
		Person person3 = new Person("小黄",18,'A');
		Object object = new Object();
		
		System.out.println(person1 == person2); //F  比较地址		
		
		System.out.println(person1.equals(person2)); //T 比较属性值
		System.out.println(person1.equals(person3)); //F
		System.out.println(person1.equals(object)); //F	
	}

}

class Person{
	
	private String name;
	private int age;
	private char gander;	//等级
	public Person(String name, int age, char gander) {
		super();
		this.name = name;
		this.age = age;
		this.gander = gander;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public char getGander() {
		return gander;
	}
	public void setGander(char gander) {
		this.gander = gander;
	}
	
	public boolean equals(Person p) {
		boolean flag = false;
		if(this == p) {	//是同一个对象
			flag = true;
		}else {
			if (this.name.equals(p.getName())) {
				if(this.age == p.getAge()) {
					if(this.gander == p.getGander()) {
						flag = true;
					}
				}
			}
		}
		return flag;
	}
	
	// alt + shift + s ==> h 自动生成重写后的equals
	// 对比自动生成的,看自己重写的。比较区别,明显自己的重写equals有bug
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (gander != other.gander)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
}

  

 

 

应用案例

在自己定义的类中重写equals方法

package object;
/**
 * 	编写Order类,有int型的orderId,String型的OrderName,private属性。
	相应的getter()和setter()方法,两个参数的构造器,
	重写父类的equals()方法:public boolean equals(Object obj),
	并判断测试类中创建的两个对象是否相等。
	属性是否相同, 相同返回 t, 否则返回 False.
 *
 */
public class ClassWork {
	public static void main(String[] args) {
		
		Order order1 = new Order(1001, "小范");
		Order order2 = new Order(1001, "小范");
		Order order3 = new Order(1002, "小黄");
		
		System.out.println(order1.equals(order2)); //T
		System.out.println(order1.equals(order3)); //F
	}
}

class Order{
	
	private int orderId;
	private String orderName;
	
	public Order(int orderId, String orderName) {
		super();
		this.orderId = orderId;
		this.orderName = orderName;
	}
	public int getOrderId() {
		return orderId;
	}
	public void setOrderId(int orderId) {
		this.orderId = orderId;
	}
	public String getOrderName() {
		return orderName;
	}
	public void setOrderName(String orderName) {
		this.orderName = orderName;
	}
	
	public boolean equals(Object obj) {
		if(this == obj) {
			return true;
		}
		
		if(!(obj instanceof Order)) {
			//不是Order类型
			return false;
		}
		//由于已经判断过Order类型,所以这里向下转型一定不会报错
		Order other = (Order)obj;
		
		return other.orderId == this.orderId && other.orderName.equals(this.orderName);
	}
}

  

 

 

原文地址:https://www.cnblogs.com/SongHai/p/14120658.html