元素是无序(存入和取出的顺序不一定一致),元素不可以重复;
查看Api会发现,set集合的功能与Collection集合的功能是一致的(就方法调用而言);
HashSet哈希表存储
底层数据结构是哈希表
HashSet存入重复元素
同姓名同年龄视为同一个人 ,重复元素
从代码上看,equals方法没有被调用
是因为HashSet集合存储是先调用hashCode方法,这里我们将hashCode方法重写一下看看
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法:hashCode与equals方法来完成;
如果hashCode值相同,才会判断equals是否为true;
如果hashCode值不同,那么不会调用equals。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法同样是hashCode、equals方法。
List与Set判断重复对象的区别?
List只依赖于equals方法
Set依赖于hashCode、equals方法
相关代码如下
package com.javaxl;
import java.util.HashSet;
import java.util.Iterator;
/**
* @author 小李飞刀
* @site www.javaxl.com
* @company
* @create 2019-05-13 14:45
*/
public class HashSetDemo {
public static void main(String[] args) {
HashSet hs = new HashSet();
// hs.add("java01");
// hs.add("java02");
// hs.add("java03");
// hs.add("java04");
// hs.add("java02");
// hs.add("java03");
hs.add(new Peroon("java01",11));
hs.add(new Peroon("java02",12));
hs.add(new Peroon("java03",13));
hs.add(new Peroon("java04",14));
hs.add(new Peroon("java02",12));
System.out.println("包含Java02:"+hs.contains(new Peroon("java02",12)));
System.out.println("删除Java02:"+hs.remove(new Peroon("java02",12)));
System.out.println("包含Java02:"+hs.contains(new Peroon("java02",12)));
Iterator it = hs.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
}
class Peroon{
private String name;
private int age;
public Peroon() {
}
public Peroon(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return this.getName().hashCode()+this.age*16;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Peroon){
Peroon p = (Peroon)obj;
System.out.println(this.getName()+"......equals......"+p.getName());
return (this.getName().equals(p.getName()) && this.getAge() == p.getAge());
}
return false;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有