zoukankan      html  css  js  c++  java
  • 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);
    	}
    }
    

      

     

     

  • 相关阅读:
    asp.net ajax传递Json给aspx.cs后台 webmethod方法传递json
    新手 Redis 配置笔记(windows),附下载地址
    在 LINQ to Entities 查询中无法构造实体或复杂类型
    WebApi 4.0 默认方式不支持HttpGet 请求
    jQuery .Ajax Error Handling Function
    My97DatePicker 与 某个CSS冲突 ,导致无法显示
    基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系
    使用Autofac部署IIS6.0时未能加载文件或程序集“System.Core, Version=2.0.5.0...“
    Could not load file or assembly 'System.Core, Version=2.0.5.0 和autofac冲突的问题
    线程间操作无效: 从不是创建控件“textBox2”的线程访问它
  • 原文地址:https://www.cnblogs.com/SongHai/p/14120658.html
Copyright © 2011-2022 走看看