HashSet如何保证数据对象不一致,附带总结hashCode和equals函数
基本概念
Set接口继承自Collection接口,我们都知道Set只能存储单一对象,所以重复加入相同的对象,Set只会存储一个对象,而且Set存储的对象是无序的。其保证存储的集合对象不同的方法主要来自于hashCode和equals两个函数的使用和判断。
其实现类常用为HashSet和TreeSet,这里我们主要讨论的是HashSet。
add函数
这里我们使用HashSet实现Set接口时,要实现其add方法,为了判断加入的对象是否已经在集合中存在,首先对要加入的对象与集合中对象的hashcode进行比较,如果集合中没有对象与待加入对象的hashcode一致,则将其加入集合,如果集合中存在对象与其hashcode一致,则接下来调用equals函数判断两者是否相同,若相同则删除对象,否则加入到集合中。
这里的hashcode函数和equals函数均可重写,但是不会改变其调用的顺序。
Set存储对象的hashcode函数和equals函数重写
首先确认一点java所有类对象的默认hashcode函数不是映射到其存储地址,会和其地址有关联,对地址进行hash计算,但是两个在内存中不同位置的对象其hashcode可能一致,当然这种情况出现的概率极低,所以当你想根据一个对象的字段值来判断两个两个对象是否相同时,不只是重写equals函数,还必须重写hashcode函数。例子如下:
Person类
public class Person {
private String name;
private int age;
pub