• Java 基础( == 和 equals 的区别)


    1. == 既可以比较基本类型也可以比较引用类型。对于基本类型就是比较值,对于引用类型就是比较内存地址

    2. equals的话,它是属于java.lang.Object类里面的方法,如果该方法没有被重写过默认也是==; 我们可以看到String等类的equals方法是被重写过的,而且String类在日常开发中用的比较多,久而久之,形成了equals是比较值的错误观点。

    3. 具体要看自定义类里有没有重写Object的equals方法来判断。

    4. 通常情况下,重写equals方法,会比较类中的相应属性是否都相等。

    重写 equals()方法的原则

    • 对称性: 如果 x.equals(y) 返回是 "true",那么 y.equals(x) 也应该返回是 "true"。
    • 自反性: x.equals(x) 必须返回是 "true"。
    • 传递性: 如果 x.equals(y) 返回是 "true",而且 y.equals(z) 返回是 "true" ,那么 z.equals(x) 也应该返回是 "true"。
    • 一致性: 如果 x.equals(y) 返回是 "true",只要 x 和 y 内容一直不变,不管你重复 x.equals(y) 多少次,返回都是"true"。
    • 任何情况下,x.equals(null),永远返回是 "false"; x.equals(和 x 不同类型的对象) 永远返回是 "false"。

    Customer.java

    package com.klvchen.java1;
    
    public class Customer {
    	
    	private String name;
    	private int age;
    	
    	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 Customer(String name, int age) {
    		super();
    		this.name = name;
    		this.age = age;
    	}
     
    	//自动生成的 equals()
    	@Override
    	public boolean equals(Object obj) {
    		if (this == obj)
    			return true;
    		if (obj == null)
    			return false;
    		if (getClass() != obj.getClass())
    			return false;
    		Customer other = (Customer) 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;
    	}
    	
    	//重写的原则:比较两个对象的实体内容(即:name和age)是否相同
    	//
    //	@Override
    //	public boolean equals(Object obj) {
    //		if(this == obj) {
    //			return true;
    //		}
    //		
    //		if(obj instanceof Customer) {
    //			Customer cust = (Customer)obj;
    //			//比较两个对象的每个属性是否相同
    //			if(this.age == cust.age && this.name.equals(cust.name)) {
    //				return true;
    //			}
    ////			或
    ////			return this.age == cust.age && this.name.equals(cust.name)
    //		}
    //			
    //		return false;
    //	}
    }
    
    

    EqualsTest.java

    package com.klvchen.java1;
    
    import java.util.Date;
    
    /*
     * == 的使用:
     * ==:运算符
     * 1. 可以使用在基本数据类型变量和引用数据类型变量中
     * 2. 如果比较的是基本数据类型变量:比较两个变量保存的数据是否相等。(不一定类型要相同)
     *    如果比较的是引用数据类型变量:比较两个对象的地址值是否相同。即两个引用是否指向同一个对象实体
     *    
     * equals()方法的使用
     * 1. 是一个方法,而非运算符
     * 2. 只能适用于引用数据类型
     * 3. Object 类中 equals() 的定义:
     *    public boolean equals(Object obj) {
                return (this == obj);
          }
          说明:Object类中定义的equals()和==的作用是相同的:比较两个对象的地址值是否相同.即两个引用是否指向同一个对象
     * 
     *  4. 像String, Date, File, 包装类等都重写了 Object 类中的 equals( )方法。重写以后,比较的不是
     *     两个引用的地址是否相同,而是比较两个对象的 “实体内容” 是否相同。
     *     
     *  5. 通常情况下,我们自定义的类如果使用 equals() 的话,也通常是比较两个对象的"实体内容"是否相同。
     *     那么,我们就需要对 Object类中的 equals() 进行重写。
     *     重写的原则:比较两个对象的实体内容是否相同。
     */
    
    public class EqualsTest {
    	public static void main(String[] args) {
    		
    		int i = 10;
    		int j = 10;
    		double d = 10.0;
    		System.out.println(i == j);  //true
    		System.out.println(i == d);  //true
    		
    		boolean b = true;
    //		System.out.println(i == b);
    		
    		char c = 10;
    		System.out.println(i == c);  //true
    		
    		char c1 = 'A';
    		char c2 = 65;
    		System.out.println(c1 == c2);  //true
    		
    		Customer cust1 = new Customer("Tom", 21);
    		Customer cust2 = new Customer("Tom", 21);
    		System.out.println(cust1 == cust2); //false
    		
    		String str1 = new String("klvchen");
    		String str2 = new String("klvchen");
    		System.out.println(str1 == str2);   //false
    		
    		System.out.println("***********************************************");
    		System.out.println(cust1.equals(cust2)); //默认为 false; 重写 equals()方法后为 true 
    		System.out.println(str1.equals(str2));   //true
    		
    		Date date1 = new Date(324566121L);
    		Date date2 = new Date(324566121L);
    		System.out.println(date1.equals(date2)); //true
    		
    	}
    }
    

    运行结果:

  • 相关阅读:
    一款垃圾的仿资源管理器+局域网Ping网段的工具(winform+异步线程) 留了问题
    ruby实现按键精灵的功能
    委托与事件 在.net的争霸战 ,你选择了谁?(异步委托产生的原因)
    小记C语言指针p与*p
    奔波的这 3月份
    ruby实现删除自定义后缀名文件Find
    "new" 出一个新未来——关于new的揭秘
    学了一招半式策略模式(设计模式)
    配置类的定义与使用
    js编写
  • 原文地址:https://www.cnblogs.com/klvchen/p/14446779.html
Copyright © 2020-2023  润新知