public class SetTest {
public static void main(String[] args) {
Set s = new HashSet();
Person p = new Person("person-5");
Person p1 = new Person("person-5");
s.add(p);
s.add(p1);
System.out.println(p.equals(p1));
System.out.println(p.hashCode() == p1.hashCode());
System.out.println(s.size());
for(Object o : s){
Person pp = (Person) o;
//System.out.println(pp.hashCode());
System.out.println(pp.getName());
}
// String str1 = "xxx";
// String str2 = new String("xxx");
// System.out.println(str1==str2);
// s.add(str1);
// s.add(str2);
// System.out.println(s.size());
// for(Object o : s){
// System.out.println(o);
// }
}
}
class Person{
private String name;
public Person(String name){
setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean equals(Person p){
if(p != null){
if(p.getName().equals(this.getName())){
return true;
}
}
return false;
}
public int hashCode(){
//return new Integer(getName()).hashCode();
return 100;
}
}
set 有add 方法返回布尔类型的值
hasset内部通过HashMap维护,HashMap可以知道是否存在
backingMap为HasMap
public boolean add(E object) {
return backingMap.put(object, this) == null;
}
重写hashcode 和equals方法,要两个都不一样才会认为不一样
hashCode和equals方法,在加入的时候判断,加入后就不判断了
if (s.contains(xxx) == true ){skip;}
else{
do work
}
以上是伪代码,请自己修正
虽然这样可以实现,但还是建议在实际应用中不要这样做,因为这样真的欺骗编译器真的不好。。
import java.util.HashSet;
import java.util.Set;
/**
* 添加重复值到set
* <p>
* <p>
* <p>
* Created by puruidong on 2015/07/07.
*/
class Books{
private String id;
private String name;
public Books(String id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj) {
return false;
}
@Override
public int hashCode() {
return (int) (Math.random()*1000);
}
}
public class Main {
public static void main(String[] args) {
Set<Books> set = new HashSet<Books>();
Books b = new Books("1","abc");
set.add(b);
set.add(b);
set.add(b);
set.add(b);
set.add(b);
System.out.println(set.size());//输出5
}
}