equals()方法和hashCode()方法简单使用
equals()一般用来比较数据的地址是否相等,针对字符串类型,如此比较没有没有问题,但是在对象之间进行比较,单纯的比较地址就有些问题,比如学生对象,地址相同,但是具体的属性也要进行比较,才能判断是否就是同一个学生
调用从object类继承的equals方法,该方法默认比较两个对象的地址
但是在现实生活中比较两个学生是不是不是同一个人,就不能用比较地址的方法来比较,还要看看具体的属性是否一样,所以需要重写equals()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | public class Student extends Object { /** * 学号 */ private int id; /** * 姓名 */ private String name; /** * @return the id */ public int getId() { return id; } /** * @param id the id to set */ public void setId( int id) { if (id > 0 ) { this .id = id; } else { System.out.println( "学号不合理!!" ); } } /** * @return the name */ public String getName() { return name; } /** * @param name the name to set */ public void setName(String name) { this .name = name; } /** * @param id * @param name */ public Student( int id, String name) { super (); this .id = id; this .name = name; } @Override public boolean equals(Object obj) { if ( null == obj) { return false ; } if ( this == obj) { return true ; } if (obj instanceof Student) { // 当传输的是我们需要的类型时候,进行强制类型转换 Student student = (Student) obj; if ( this .id == student.id && this .name.equals(student.name)) { return true ; } else { return false ; } } return false ; } } |
1 2 3 4 5 6 7 8 9 10 11 | Student student1 = new Student( 1001 , "qiuxie" ); Student student2 = new Student( 1002 , "zhouxiaomei" ); Student student3 = new Student( 1001 , "qiuxie" ); Student student4 = student1; Student student5 = null ; Integer integer = 1 ; System.out.println( "student1和student2比较结果:" + student1.equals(student2)); System.out.println( "student1和student3比较结果:" + student1.equals(student3)); System.out.println( "student1和student4比较结果:" + student1.equals(student4)); System.out.println( "student1和student5比较结果:" + student1.equals(student5)); System.out.println( "student1和integer比较结果:" + student1.equals(integer)); |
这里使用instanceof是因为,obj不一定是Student类型,有可能是别的类型
hashCode()返回对象的哈希码值,即内存地址的编号
重写equals()方法,同时也是需要重写hashCode()方法
假如两个对象调用equals方法相等,则调用hashCode方法结果必须相同
假如两个对象调用equals方法不相等,则调用hashCode方法结果应该不相同
为了保证hashCode()和equals方法一致,需要重写hashCode()方法
1 2 3 4 5 6 7 8 9 10 11 12 13 | Student student1 = new Student( 1001 , "qiuxie" ); Student student2 = new Student( 1002 , "zhouxiaomei" ); Student student3 = new Student( 1001 , "qiuxie" ); Student student4 = student1; System.out.println( "student1和student2比较结果:" + student1.equals(student2)); System.out.println( "student1和student3比较结果:" + student1.equals(student3)); System.out.println( "student1和student4比较结果:" + student1.equals(student4)); System.out .println( "student1.hashCode()=" + student1.hashCode() + " student2.hashCode()=" + student2.hashCode()); System.out .println( "student1.hashCode()=" + student1.hashCode() + " student3.hashCode()=" + student3.hashCode()); System.out .println( "student1.hashCode()=" + student1.hashCode() + " student4.hashCode()=" + student4.hashCode()); |
重写hashCode方法
1 2 3 4 5 6 | @Override public int hashCode() { final int type = 12 ; return type * 31 + getId(); } |
保证了equals比较结果相同,hashCode结果相同,重写的方法避免了使用内存地址编号
下面列出基本类型和包装类型的比较
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int a = 1 ; int b = 1 ; if (a == b) { System.out.println( "相等" ); } else { System.out.println( "不相等" ); } Integer cInteger = 2 ; Integer dInteger = 2 ; if (cInteger.equals(dInteger)) { System.out.println( "包装类型相等" ); } else { System.out.println( "包装类型不相等" ); } |
java中的Serializable接口的作用
当我们需要把对象的状态信息通过网络进行传输,或者需要将对象的状态信息持久化,以便将来使用时都需要把对象进行序列化
例如:Integer实现了Serializable,所以可以把一个Integer的对象用IO写到文件里,之后再可以从文件里读出,如你开始写入的时候那个对象的intValue() 是5的话,那读出来之后也是5。这一点体现了用序化类的作用,即用来传送类的对象
好处就是自动屏蔽了操作系统的差异
标签:
java基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异