Java中的equals方法和toString方法(基础四)

友情提醒

先看文章目录,大致了解知识点结构,直接点击文章目录可以跳转到文章指定位置。

第一章、Java中的两种比较方式:==比较和equals比较

1)Java中的 "=="比较

①== 是Java中的比较运算符
②比较基本类型时,比较的是双方的值
③比较引用类型时,比较的是双方的地址值

// 例二 字符串常量池是堆中一块特殊区域,多次使用String str=“字符串数据”创建同一个字符串数据时,会指向字符串常量池的同一个地址,所以地址一直是同一个,str0 == str1 是true
		String str0 = "比较";
		String str1 = "比较";
		System.out.println("例1:" + (str0 == str1));

		//例二 而new出来对象在堆里,不同于前面的字符串常量池会指向同一个地址,而是会创建新地址,所以str3 == str4结果是false
		String str3 = new String("地址");
		String str4 = new String("地址");
		System.out.println("new了以后都会在堆中建立新地址");
		System.out.println("例2:" + (str3 == str4));//false
		// 例三  基本数据类型,==判断的是值
		int a1 = 1;
		int a2 = 1;
		System.out.println("例3:" + (a1 == a2));

比较结果如下:可以看到==比较的是引用类型数据的地址,想不比较地址就需要用到equals方法

1true1false
new了以后都会在堆中建立新地址
例2false3true

2)Java中的 equals比较

①equals方法是object类中的方法,所以任何类都可以重写这个方法
ps:不懂什么是方法重写看这篇文章==》方法的重写和重载

②只能用于判断引用类型,重写后用于判断内容是否相等。
③不重写方法的话就是使用==操作符判断引用类型的地址值。所以一定要记得重写啊,不然白给。
下面是重写详解:

 //-------------------------------分割---------------------------------
class Person {
    private String name;
    private int age;
 
//重写Object的equals方法
    public boolean equals(Object obj) {
//同对象判断,比较的两个对象是同一个对象返回true
        if (this == obj){   //this代表调用equals方法的对象
            return true;
        }
        if (obj == null) { //传进来是null值,直接返回false
			return false;
		}
		if (this.getClass() != obj.getClass()) { //getClass()返回Class类型的对象。
			return false;
		}
//同类型判断
        if (obj instanceof Person){  //obj是Person,我们才比较
//如果程序能够执行到此处,说明传入的不是null,并且不是同一对象,而且是两个对象都是Person类型的
//obj属于Object类型,Object类中没有定义过name、age、sex属性,为了获得属性强转操作:Object -> Person,
            Person p = (Person) obj;
//name是String类型,也是引用类型所以用equals,age是int类型用==就好
            return this.name.equals(p.name) && this.age == p.age;
        }
        //如果不是person,则直接返回false;
        return false;
    }
 //构造方法
  	public Person() {
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
//getter&setter方法
    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;   }
}

测试equasl方法

/*
判断两个person对象的内容是否相等属性值一样,返回true,不同返回false
 */
public class TestEquals {
    public static void main(String[] args) {
        Person p1 = new Person("张三", 22);
        Person p2 = new Person("张三", 22);
       	System.out.println(p1 == p2);			//比较地址是否相等	false
		System.out.println(p1.equals(p2));		//true
    }
}

第二章、重写toString方法

1)toString方法

①toString方法是object类中的方法,所以任何类都可以重写这个方法
②作用其实是为了方便转为字符串,打印输出,有些引用类型打印输出的时候是地址值这是很不方便的。比如在打印引用类型的时候System.out.println(xxx),自动调用toString()方法不用显式打出来。这是为了方便所有类的字符串操作而特意加入的一个方法
③实际例子如下:

class Person {
    private String name;
    private int age;
    private char sex;
 //构造方法
  	public Person() {
    }
 public Person(String name, int age, char sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
//getter&setter
    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 getSex() {	return sex;	}
	public void setSex(char sex) {	this.sex = sex;	}

//重写toString方法
	@Override
	public String toString() {
		return "Person{" +
				"name='" + name + '\'' +
				", age=" + age +
				", sex=" + sex +
				'}';
	}
}

未重写打印结果是地址值:

equals.Person@6e8dacdf

重写后打印结果如下内容

Person{name='张三', age=30, sex=}

2)重写equals和toString方法快捷键

ps:重写equals和toString方法非常的普遍,ide工具有直接生成方法重写的快捷方式:
eclipses 是:alt + shift + s
idea是:alt + insert

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaequalstoString方法都是Object类方法,可以在所有的类直接使用。但有时候需要对这些方法进行重写,以便满足具体的需求。 1. equals方法的重写: 在Javaequals方法的默认实现是比较两个对象的引用是否相等。如果我们想要比较对象的属性是否相等,就需要重写equals方法。一般来说,我们需要在重写equals方法时遵循以下规则: (1)自反性:对于任意非空的引用值x,x.equals(x)应该返回true。 (2)对称性:对于任意的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)应该返回true。 (3)传递性:对于任意的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)也应该返回true。 (4)一致性:对于任意的引用值x和y,如果用于equals比较的对象没有被修改,那么多次调用x.equals(y)应该一致地返回true或false。 (5)非空性:对于任意非空的引用值x,x.equals(null)应该返回false。 一个典型的equals方法的重写如下: ``` @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } MyClass other = (MyClass) obj; if (myField == null) { if (other.myField != null) { return false; } } else if (!myField.equals(other.myField)) { return false; } return true; } ``` 2. toString方法的重写: 在JavatoString方法的默认实现是返回一个对象的类名和哈希码。如果我们想要返回一个更有意义的字符串,就需要重写toString方法。一般来说,我们需要在重写toString方法时遵循以下规则: (1)返回的字符串应该包含对象的重要属性值。 (2)返回的字符串应该简洁明了,易于阅读。 一个典型的toString方法的重写如下: ``` @Override public String toString() { return "MyClass [myField=" + myField + "]"; } ``` 这个方法返回一个字符串,包含了myField属性的值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值