Set集合使用HashSet存储方法,其原理是计算目标对象的Hashcode,根据Set大小来取余后选取一个位置,如果存储在同一个位置就需要比较是不是一个相同的内容,如果是不同的就在上一个内容后面进行链接(链表或者红黑树)。
- 首先创建一个长度为16的数组;
- 根据目标的HashCode值和数组长度取余数,得到一个存储的位置;
- if 位置为空 :直接存入;
- else 使用equals方法比较:
如果相同则不存,否则存储。
而对于两个对象尽管其内容是一样的,HashCode是不一样的,equals方法计算也是不同的,则就会将这两个对象都进行存储。
对于以下示例类: class Student{ int Id; String name; int age; public Student(int Id,String name,int age){ this.Id=Id; this.age=age; this.name=name; } }
因此就需要在类里面重写HashCode和equals方法。
/** * 重写HashCode之后,比较的就不是对象地址了 * @return */ @Override public int hashCode() { return Objects.hash(Id, name, age); }
/** * 重写equals之后比较里面元素来判断是不是等价的 * @param o * @return */ @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 && age == student.age && Objects.equals(name, student.name); }