Java学习心得之equals方法

一、equals方法简介

equals方法是Object类中的一个方法,通过重写该方法提供判断对象是否相等的逻辑。

1.euqals用法

Dog实体类:

public class Dog {
	private String color;
	private int weight;
	private int height;
	
	public Dog(String color,int weight,int height){
		this.color = color;
		this.weight = weight;
		this.height = height;
	}
}


测试:
 public static void main(String[] args) {
	        /**
	         * 这里使用构造方法Dog()在堆内存里面new出了两只狗,
	         * 这两只狗的color,weight,height都是一样的,但是在堆内存中它们的物理地址是不一样的。
	         * 我们知道用==,equals(没有重写该方法),比较两个对象时,比较的是两个对象的地址是否一样。
	         * 因此,在这里两只狗永远不会相等。
	         */
	        Dog d1 = new Dog("black", 5,30);
	        Dog d2 = new Dog("black", 5,30);
	        System.out.println("d1==d2的结果是:"+(d1==d2));//false
	        System.out.println("d1.equals(d2)的结果是:"+d1.equals(d2));//false
	 }

2.内存分析

程序:

 Dog d1 = new Dog("black", 5,30);
 Dog d2 = new Dog("black", 5,30);

执行完之后内存如下:



我们可以看到,d1和d2指向两个不同的地址,而==和equals(未重写)只是比较两个对象在内存中的地址是否一样,因此不能准确的判断两个对象

是否想的(d1和d2指向同一对象时,结果返回的是true)。那么如何去比较两个对象是否相等的呢?在现实生活中,我们比较两只狗是否一样,往往是通过比较

它们的属性来判断的,比如两只狗的颜色、体重、身高一样的话,我们会说这两只狗长得一样,同样的道理,在Java中比较两个对象是否相等,也可以比较两个对象之间的属性全部或部分相等来实现。这个时候我们可以通过重写equals方法,来实现判断逻辑,如下:


public class Dog {
	private String color;
	private int weight;
	private int height;
	
	public Dog(String color,int weight,int height){
		this.color = color;
		this.weight = weight;
		this.height = height;
	}
	/**
     * 这里是重写相等从Object类继承下来的equals()方法,改变这个方法默认的实现,
     * 通过我们自己定义的实现来判断决定两个对象在逻辑上是否相等。
     * 这里我们定义如果两只狗的color,weight,height都相同,
     * 那么我们就认为这两只狗在逻辑上是一模一样的,即这两只狗是“相等”的。
     */
	public boolean equals(Object obj){
		if(obj==null){
			return false;
		}
		if(obj == this){
			return true;
		}
		if(obj instanceof Dog){
			Dog d = (Dog)obj;
			if(d.color.equals(this.color) && d.weight==this.weight&&d.height==this.height){
				return true;
			}
		}
		return false;
	}
}

测试:

 public static void main(String[] args) {
	      	/**
	      	 * 我们看到,同样比较d1和d1,用equals的时候结果发生了变化
	      	 */
	        Dog d1 = new Dog("black", 5,30);
	        Dog d2 = new Dog("black", 5,30);
	        System.out.println("d1==d2的结果是:"+(d1==d2));//false
	        System.out.println("d1.equals(d2)的结果是:"+d1.equals(d2));//true
	 }


3.如何比较两个字符串是否相等

细心的朋友会发现,在上面的例子中,比较两只狗的颜色,用的是equals方法,是的字符串的比较用的就是equals方法。那么,有人会问我们根本没有重写

字符串的equals方法,为什么会这样呢?其实,在Java中String的equals,Java语言的开发者已经帮我们写好了,当然除了String类,还有其他部分类的equals

方法也已经写好了,有兴趣的可以自己去了解。以下是String类中equals方法的源码:

 public boolean equals(Object anObject) {
        if (this == anObject) {//如果是同一个对象,返回true
            return true;
        }
        if (anObject instanceof String) { //判断是否是string对象
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {//判断长度是否一致
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])//比较每个字符是否一样
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

例子:

  public static void main(String args[]){
	    	/**
	    	 * String字面量和new出来对象比较的区别
	    	 * 下面例子中:
	    	 * 当两个字符串都是字面量时,==和equals比较是没有区别的,因为此时s1和s2指向的是同一个对象,在常量池中
	    	 * 当两个字符串是new出来的时候,==和equale比较的结果是不一样的,因为new出来的是一个新的对象,必须用equals方法比较
	    	 * 
	    	 * 注意:判断字符串之间是否相等,用equal方法,切记。
	    	 * 
	    	 */
	        String s1 = "hello";
	        String s2 = "hello";
	        String s3 = new String("hello");
	        String s4 = new String("hello");
	        System.out.println("s1 == s2的结果是:"+(s1 == s2));//true
	        System.out.println("s1.equals(s2)的结果是:"+s1.equals(s2));//true
	        System.out.println("s2 == s3的结果是:"+(s2 == s3));//false
	        System.out.println("s2.equals(s3)的结果是:"+s2.equals(s3));//true
	        System.out.println("s3 == s4的结果是:"+(s3 == s4));//false
	        System.out.println("s3.equals(s4)的结果是:"+s3.equals(s4));//true
	    }
	



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 2实用教程(第三版)实验指导与习题解答 清华大学出版社 (编著 耿祥义 张跃平) 实验模版代码 建议使用文档结构图 (选择Word菜单→视图→文档结构图) 上机实践1 初识Java 4 实验1 一个简单的应用程序 4 实验2 一个简单的Java Applet程序 4 实验3 联合编译 5 上机实践2 基本数据类型与控制语句 6 实验1 输出希腊字母表 6 实验2 回文数 6 实验3 猜数字游戏 8 上机实践3 类与对象 9 实验1 三角形、梯形和圆形的类封装 9 实验2 实例成员与类成员 12 实验3 使用package语句与import语句 13 上机实践4 继承与接口 15 实验1 继承 15 实验2 上转型对象 17 实验3 接口回调 18 上机实践5 字符串、时间与数字 19 实验1 String类的常用方法 19 实验2 比较日期的大小 21 实验3 处理大整数 22 上机实践6 组件及事件处理 23 实验1 算术测试 23 实验2 信号灯 25 实验3 布局与日历 28 上机实践7 组件及事件处理2 31 实验1 方程求根 31 实验2 字体对话框 34 实验3 英语单词拼写训练 37 上机实践8 多线程 41 实验1 汉字打字练习 41 实验2 旋转的行星 43 实验3 双线程接力 47 上机实践9 输入输出流 50 实验1 学读汉字 50 实验2 统计英文单词字 53 实验2 读取Zip文件 56 上机实践10 Java 中的网络编程 57 实验1 读取服务器端文件 57 实验2 使用套接字读取服务器端对象 59 实验3 基于UDP的图像传输 62 上机实践11 数据结构 66 实验1 扫雷小游戏 66 实验2 排序与查找 70 实验3 使用TreeSet排序 72 上机实践12 java Swing 74 实验1 JLayeredPane分层窗格 74 实验2 使用表格显示日历 75 实验3 多文档界面(MDI) 78 上机实践1 初识Java 实验1 一个简单的应用程序 2.模板代码 Hello.java package 实验一; public class Hello { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("你好,很高兴学习Java"); //命令行窗口输出"你好,很高兴学习Java" A a=new A(); a.fA(); } } class A { void fA() {System.out.println("we are student"); } } 实验2 一个简单的Java Applet程序 2.模板代码 FirstApplet.java import java.applet.*; import java.awt.*; public class FirstApplet extends Applet { public void paint(Graphics g) { g.setColor(Color.blue); g.drawString("这是一个Java Applet 程序",10,30);//在Java Applet中绘制一行文字:“这是一个Java Applet 程序” g.setColor(Color.red); g.setFont(new Font("宋体",Font.BOLD,36)); g.drawString("我改变了字体",20,50);//在Java Applet中绘制一行文字:“我改变了字体” } }实验3 联合编译 2.模板代码 public class MainClass { public static void main (String args[ ]) { System.out.println("你好,只需编译我") ; //命令行窗口输出"你好,只需编译我" A a=new A(); a.fA(); B b=new B(); b.fB(); } } public class A { void fA() {

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值