第一次输出是1002 BB输出在前,如果是按照添加元素的顺序输出不应该是1001 AA先输出吗?
后三次输出的排序也看不明白,求大佬指点一下
@Test
public void test3(){
HashSet set = new HashSet();
Person p1 = new Person(1001,"AA");
Person p2 = new Person(1002,"BB");
set.add(p1);
set.add(p2);
System.out.println(set);
p1.name = "CC";
set.remove(p1);
System.out.println(set);
set.add(new Person(1001,"CC"));
System.out.println(set);
set.add(new Person(1001,"AA"));
System.out.println(set);
}
以上代码输出的结果是
[Person{id=1002, name='BB'}, Person{id=1001, name='AA'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}]
[Person{id=1002, name='BB'}, Person{id=1001, name='CC'}, Person{id=1001, name='CC'}, Person{id=1001, name='AA'}]
Person类中重写的toString 、equals、hashCode 方法如下
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (id != person.id) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
HashSet是无序集合,每次执行的效果都是不一样的,随机的。
重写hash方法,是因为重写了equals方法,为了比较值的相等。
你只要知道Set集合是无序,List集合是有序的就好了。
至于为什么是无序,这个就跟底层有关系了,底层是链表+数组。
HashSet
是一个无序的列表,每次取得顺序都不一样
HashSet没有顺序,Hash开头的集合类都没有顺序。