2020年12月11日星期五

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);	}}

  

 

 









原文转载:http://www.shaoqun.com/a/498637.html

巴克莱:https://www.ikjzd.com/w/2775

dmm.adult:https://www.ikjzd.com/w/2026

执御:https://www.ikjzd.com/w/717.html


Java基础之:equals"=="比较运算符首先我们重温一下一直在使用的"=="比较运算符1)==:比较运算符,既可以判断基本类型,又可以判断引用类型2)==:比较运算符,如果判断基本类型,判断的是值是否相等。示例:inti=10;doubled=10.0;i==dtrue3)==:比较运算符,如果判断引用类型,判断的是地址是否相等.equals方法equ
杨帆:杨帆
wario:wario
图文实操:亚马逊数据化选品终极指南(中):图文实操:亚马逊数据化选品终极指南(中)
从中山去珠海石景山公园怎么走?:从中山去珠海石景山公园怎么走?
老虎谷暗河漂流大巴怎么坐?清远老虎谷暗河漂流旅游线路?:老虎谷暗河漂流大巴怎么坐?清远老虎谷暗河漂流旅游线路?

没有评论:

发表评论