java:Set對象TreeSet有序子類,HashSet無序子類,重復對象二
阿新 • • 發佈:2017-09-03
hash ceo person system boolean 需要 false tostring 兩個
TreeSet有序子類;
HashSet無序子類
重復重復元素,Object對象是通過equals和hashCode來進行過濾的。
如果將上一篇提到中的例子中的TreeSet,換成HashSet,那麽代碼就不會過濾從的對象
HashSet無序子類,如何過濾重復的對象呢?(單個元素是可以過濾,但相同的對象不會)
Person:
public class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } 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; } @Override public String toString() { return "姓名:" + name + ", 年齡:" + age + ""; } public int compareTo(Person o) { // TODO 自動生成的方法存根 if(this.age > o.age) { return 1; }else if(this.age < o.age) { return -1; }else{ //如果age年齡相同需要在判斷name,是否重復 return this.name.compareTo( o.name ); } } }
SetDemo3:
Set<Person> allSet = new HashSet<Person>(); allSet.add(new Person("張三",30)); //重復對象 allSet.add(new Person("張三",30)); allSet.add(new Person("李四",30)); allSet.add(new Person("王五",31)); allSet.add(new Person("趙六",31)); allSet.add(new Person("田七",32)); //重復對象 allSet.add(new Person("田七",32)); System.out.println(allSet);
輸出結果:
[姓名:王五, 年齡:31, 姓名:田七, 年齡:32, 姓名:田七, 年齡:32, 姓名:張三, 年齡:30, 姓名:張三, 年齡:30, 姓名:李四, 年齡:30, 姓名:趙六, 年齡:31]
這時需要過濾掉重復的對象,那麽Person還需要復寫equels,和HashCode兩個方法,這兩個方法作用了過濾重復的對象:
public int hashCode() { return this.name.hashCode() * this.age; } public boolean equals(Object o) { if(this == o) { return true; } if( !(o instanceof Person) ) { return false; } Person p = (Person) o; if(this.name.equals(p.name) && this.age == p.age) { return true; }else{ return false; } }
執行的結果:
[姓名:趙六, 年齡:31, 姓名:李四, 年齡:30, 姓名:張三, 年齡:30, 姓名:王五, 年齡:31, 姓名:田七, 年齡:32]
java:Set對象TreeSet有序子類,HashSet無序子類,重復對象二