HashSet 重写类的equals方法可以根据类的关键字段判断是否相等
来源:互联网 发布:淘宝桌面快捷方式 编辑:程序博客网 时间:2024/06/05 17:56
HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同的
搜索定位数量大于等于8则用HashSet,小于8则用List
HashSet 本来要求每个元素(可能是包含多个字段的类)绝对不相等,但是重写类的equals方法可以根据类的关键字段判断是否相等
class Name
{
private String first;
private String last;
public Name(String first, String last)
{
this.first = first;
this.last = last;
}
// 根据 first 判断两个 Name 是否相等
public boolean equals(Object o)
{
if (this == o)
{
return true;
}
if (o.getClass() == Name.class)
{
Name n = (Name)o;
return n.first.equals(first);
}
return false;
}
// 根据 first 计算 Name 对象的 hashCode() 返回值
public int hashCode()
{
return first.hashCode();
}
public String toString()
{
return "Name[first=" + first + ", last=" + last + "]";
}
}
public class HashSetTest2
{
public static void main(String[] args)
{
HashSet<Name> set = new HashSet<Name>();
set.add(new Name("abc" , "123"));
set.add(new Name("abc" , "456"));
System.out.println(set);
}
}
上面程序中提供了一个 Name 类,该 Name 类重写了 equals() 和 toString() 两个方法,这两个方法都是根据 Name 类的 first 实例变量来判断的,当两个 Name 对象的 first 实例变量相等时,这两个 Name 对象的 hashCode() 返回值也相同,通过 equals() 比较也会返回 true。
程序主方法先将第一个 Name 对象添加到 HashSet 中,该 Name 对象的 first 实例变量值为"abc",接着程序再次试图将一个 first 为"abc"的 Name 对象添加到 HashSet 中,很明显,此时没法将新的 Name 对象添加到该 HashSet 中,因为此处试图添加的 Name 对象的 first 也是" abc",HashSet 会判断此处新增的 Name 对象与原有的 Name 对象相同,因此无法添加进入,程序在①号代码处输出 set 集合时将看到该集合里只包含一个 Name 对象,就是第一个、last 为"123"的 Name 对象
http://alex09.javaeye.com/blog/539549
- HashSet 重写类的equals方法可以根据类的关键字段判断是否相等
- 重写equals方法判断类的值是否相等
- 判断对象是否相等---重写equals方法
- 给你的类重写Equals--检测Class是否相等
- 给你的类重写Equals--检测Class是否相等
- equals()方法的应用,判断引用类型是否相等
- 比较两个对象的内容是否相等 重写object 的equals方法
- java中判断类对象是否相等的方法
- 重写类的equals方法
- 判断两个对象是否相等,为什么必须同时重写equals()和hashcode()方法
- 判断两个对象是否相等,为什么必须同时重写equals()和hashcode()方法
- 不要使用equals方法对AtomicXXX进行是否相等的判断
- 不要使用equals方法对AtomicXXX进行是否相等的判断
- 集合Set判断对象是否相等的equals和hashCode
- Java用重载的equals()判断实例变量是否相等
- 浅析HashSet中equals()与hashCode()方法的重写
- HashSet中equals()与hashCode()方法的重写
- HashSet中equals()与hashCode()方法的重写
- MFC改变static text颜色
- 怎样看懂Oracle的执行计划
- Base64编码
- Windows Azure 1.3 新特性-Start-Up 任务
- 进制之间的转换
- HashSet 重写类的equals方法可以根据类的关键字段判断是否相等
- undefined reference to `sin'
- MSD对多个字符串的排序算法
- 在Struts 2中使用JSON Ajax支持
- gSoap的简易使用流程
- Oracle日期增加年/月/日/时/分/秒
- C++ http 请求
- 今天
- C中位域Struct操作