Set集合,无索引,不可以重复,无序(存取不一致)
- set集合的add()方法若加入的元素已存在,则返回false,
- HashSet的继承体系中有重写toString方法。
- 遍历用增强for循环去遍历:(所有用迭代器遍历的都可以用增强for循环遍历)
public static void main(String[] strings){
HashSet<String> hs=new HashSet<>();
hs.add("a");
hs.add("b");
hs.add("c");
hs.add("ab");
hs.add("abc");
hs.add("abcd");
for (String str:hs) {
System.out.println(str);
}
System.out.println(hs);
}
HashSet中存储对象元素时,根据对象的属性一致,就判定为同一对象的实现:
//HashSet 底层首先调用hashCode()方法,当返回的hashCode值不同时,直接认为两个对象不同;
// 当返回的hashCode值相同时,再去调用equals方法,
@Test
public void addObject(){
HashSet<Person> hashSet= new HashSet<Person>();
hashSet.add(new Person("赵云",20));
hashSet.add(new Person("赵云",20));
System.out.println(hashSet.size());
}
//为了实现属性相同的对象只存储一次,需要重写该对象的hashCode()方法和equals()方法
//直接生成
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return id == person.id &&
age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name, age);
}
我们使用Set集合都是要去除重复元素的,如果逐个equals去比较,效率低,哈希算法提高了去重复的效率,降低了equals方法的次数,当时有add方法加入存储对象时,小调用hashCode()得到一个哈希值,在集合中查找是否有哈希值相同的对象,
- 如果没有哈希值相同的,就直接存入;
- 如果有哈希值相同的,就和哈希值相同的对象逐个调用equals方法比较,返回false就存入,true则不存。