equals使用和重写
来源:互联网 发布:kettle java代码 编辑:程序博客网 时间:2024/06/11 08:43
equals用于比较两个对象是否是相同的,基本类型是比较值,引用类型是比较的地址.
但有时我们需要比较两个类是否是相同的,比较的是某些属性的值,这就要涉及到重写.
先创建一个People类
重写里面的hashCode和equals方法
public class People { private String name; private int age; public People() { super(); } public People(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "People [name=" + name + ", age=" + age + "]"; } // 系统自动生成的对象的唯一编号 // 1. equals 相等的两个对象hashCode必须一致 // 系统为了提高效率,HashSet等判断两个相等的时候,会先比较hashCode // 如果一致,调用equals进行比较,如果不一致,那就认为不相同 // 重写equals方法,必须重写hashCode保证值相等对象,hashCode也相等 // 2.hashCode 相等的equals不一定相等 @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) // 同一个对象进行比较肯定是相同的 return true; // 如果没有{}那么只有紧跟着if的下行一行代码在if判断内 if (obj == null) // 如果参数为空 肯定不相等 return false; if (!(obj instanceof People)) // instance 实例化,创建对象 return false; // instanceof 判断是否是某个类的对象 // 判断obj是否是People或其子类的对象 // true是 false不是 // 排除所有错误的情况 进行值的比较 People other = (People) obj; // obj的编译时类型是object 决定我们写代码时能够调用哪些属性和方法 // 调用不了People类的name和age属性 // 通过强制转换,把编译时类型改为People,就可以调用People的属性和方法了 // 比较两个对象属性的值,是否相等 if (age != other.age) return false; if (name == null) { // 如果name == null 调用equals方法会产生空指针异常 if (other.name != null) // 一个为null,另一个不为null return false; } else if (!name.equals(other.name)) // 取反,不相等的时候返回false return false; return true; // 如果能够执行到这里,说明age和name相同 }}
再创建一个Test类
import java.util.ArrayList;import java.util.HashSet;public class Test { public static void main(String[] args) { HashSet<String> hs1 = new HashSet<String>(); hs1.add("ABC"); hs1.add("ABC"); // HashSet 相同的元素只会添加一个,靠的是hashCode和equals方法 // 引用类型==比较的是地址,equals 默认比较的是地址 // 可以重写equals方法实现值的比较,比如String People p1 = new People("张三",20); People p2 = new People("张三",20); System.out.println("p1==p2"+(p1==p2)); System.out.println("p1.equals(p2)"+(p1.equals(p2))); HashSet<People> hs2 = new HashSet<People>(); hs2.add(p1); hs2.add(p2); // HashSet使用equals进行对象的比较 // 如果相同就认为是同一个对象,不再加入到Set中 for (People people : hs2) { System.out.println(hs2); } ArrayList<People> al1 = new ArrayList<People>(); al1.add(p1); // contains 也是比较值,不是比较地址 System.out.println("al1.contains(p2)" + al1.contains(p2)); // such that (o==null)?e==null:o.equals(e)) // o 为参数 e 数组中的每一个元素 // 如果参数为null 判断e 是否为null,为null返回true // 如果参数不为null,判断o和e的值是否相等 // 进行值的比较,contains其实就是return indexOf(o)>= 0; // 找到返回索引 找不到返回-1 System.out.println("元素在数组中的索引:" + al1.indexOf(p2)); }}
equals方法可以根据我们的需要进行修改,以实现我们想要的比较功能.
阅读全文
0 0
- equals使用和重写
- [Java] 使用散列时,重写HashCode和Equals
- 重写equals()和hashCode()
- 重写equals()和hashCode()
- 重写equals 和 hashCode
- 重写equals 和HashCode
- 重写equals 和 hashcode
- hashCode和equals重写
- 重写equals和hashcode
- hashCode()和equals()重写
- 重写equals和hashCode
- 重写equals 和 hashCode
- 使用Set存储Object对象,重写equals和hashCode方法
- 重写hashCode()方法和重写equals()方法
- Java:重写equals()和hashCode()
- Java:重写equals()和hashCode()
- Java:重写equals()和hashCode()
- Java: 重写equals()和hashCode()
- codeforces 719A Vitya in the Countryside
- HDU
- Spark2.x---4. Deploy模块解析
- CSS深入理解vertical-align和line-height的基友关系
- 希尔排序
- equals使用和重写
- test
- Hive
- Android机用移动数据流量获取也能获取mac地址的终极方法。(第二种方法)
- HDU 6034 Balala Power!
- 4 Values whose Sum is 0 --CSU-ACM2017暑假集训2-二分搜索
- hdu 1166 敌兵布阵【入门线段树 & 树状数组】
- 选择排序
- 《如何管理程序猿》