Java&核心类库.V04
2022/4/3 20:19:51
本文主要是介绍Java&核心类库.V04,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
[BigDataJava:Java&核心类库.V04] [BigDataJava.核心类库][|章节一|Java核心类库|equals方法的重写实现|equals方法的重写|equals方法和hashCode方法的生成|]
一、[equals方法的重写实现]equals方法的重写equals方法和hashCode方法的生成]:equals方法的重写实现
package com.yanqi.task11; import java.util.Objects; public class Student extends Object { private int id; // 用于描述学号的成员变量 private String name; // 用于描述姓名的成员变量 public Student() { } public Student(int id, String name) { setId(id); setName(name); } public int getId() { return id; } public void setId(int id) { if (id > 0) { this.id = id; } else { System.out.println("学号不合理哦!!!"); } } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return id == student.id && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(id, name); } @Override public String toString() { return "Student{" + "id=" + id + ", name='" + name + '\'' + '}'; } /* @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; if (id != student.id) return false; return name != null ? name.equals(student.name) : student.name == null; } @Override public int hashCode() { int result = id; result = 31 * result + (name != null ? name.hashCode() : 0); return result; } */ /** * 为了比较两个对象的内容,也就是学号信息需要重写该方法 */ // Student this = s1; // Object obj = s2; /* @Override public boolean equals(Object obj) { // 当调用对象和参数对象指向同一个对象时,则内容一定相同 if (this == obj) return true; // 当调用对象为不为空而参数对象为空时,则内容一定不相同 if (null == obj) return false; // 判断obj指向的对象是否为Student类型的对象,若是则条件成立,否则条件不成立 if (obj instanceof Student) { Student ts = (Student) obj; // 以学号作为基准判断两个对象是否相等 int是基本数据类型,内存空间中放的就是数据本身,使用 == 可以判断数据是否相同 //return this.getId() == ts.getId(); // 以姓名作为基准判断两个对象是否相等 String是引用数据类型,内存空间中放的是地址,使用 == 判断地址是否相同 // 也就是判断两个对象中姓名字符串的地址是否相同,不够完美 //return this.getName() == ts.getName(); return this.getName().equals(ts.getName()); // 比较姓名字符串的内容是否相同 } // 否则类型不一致没有可比性,则内容一定不相同 return false; } */ /** * 为了使得该方法的结果与equals方法的结果保持一致,从而满足Java官方的常规协定,需要重写该方法 */ /* @Override public int hashCode() { //return getId(); // 不再代表内存地址的编号了 final int type = 12; //return type*31 + getId(); return type*31 + getName().hashCode(); } */ /** * 为了返回更有意义的字符串数据,则需要重写该方法 */ /* @Override public String toString() { return "Student[id = " + getId() + ", name = " + getName() + "]"; } */ }
二、编程代码
package com.yanqi.task11; public class StudentTest { public static void main(String[] args) { // 1.使用有参方式构造Student类型的两个对象并判断是否相等 Student s1 = new Student(1001, "zhangfei"); //Student s2 = new Student(1002, "guanyu"); Student s2 = new Student(1001, "zhangfei"); //Student s2 = s1; // 表示s2和s1都指向了同一个对象,地址相同了 // 下面调用从Object类中继承下来的equals方法,该方法默认比较两个对象的地址,可以查看源码验证 // 当Student类中重写equals方法后,则调用重写以后的版本,比较内容 //boolean b1 = s1.equals(s2); //Student s3 = null; //boolean b1 = s1.equals(s3); //Student s3 = s1; boolean b1 = s1.equals(s2); System.out.println("b1 = " + b1); // false true System.out.println(s1 == s2); // 比较地址 false System.out.println("----------------------------------------------------------"); // 下面调用从Object类中继承下来的hashCode方法,获取调用对象的哈希码值(内存地址的编号) // 当Student类中重写hashCode方法后,则调用重写以后的版本 int ia = s1.hashCode(); int ib = s2.hashCode(); System.out.println("ia = " + ia); System.out.println("ib = " + ib); System.out.println("----------------------------------------------------------"); // 下面调用从Object类中继承下来的toString方法,获取调用对象的字符串形式:包名.类名@哈希码值的十六进制 // 当Student类中重写toString方法后,则调用重写以后的版本:Student[id = 1001, name = zhangfei] String str1 = s1.toString(); System.out.println("str1 = " + str1); // com.yanqi.task11.Student@55d System.out.println(s1); // 当打印一个引用变量时会自动调用toString方法 String str2 = "hello" + s1; System.out.println("str2 = " + str2); } }
三、编译打印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=49684:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task11.StudentTest b1 = true false ---------------------------------------------------------- ia = -1432584938 ib = -1432584938 ---------------------------------------------------------- str1 = Student{id=1001, name='zhangfei'} Student{id=1001, name='zhangfei'} str2 = helloStudent{id=1001, name='zhangfei'} Process finished with exit code 0
===============================END===============================
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart ——W.S.Landor
来自为知笔记(Wiz)
这篇关于Java&核心类库.V04的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?