package com.imooc.set;
public class Cat {
private String name;
private int month;
private String species;
public Cat(String name, int month, String species) {
super();
this.name = name;
this.month = month;
this.species = species;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public String getSpecies() {
return species;
}
public void setSpecies(String species) {
this.species = species;
}
@Override
public String toString() {
return "Cat [name=" + name + ", month=" + month + ", species=" + species + "]";
}
//做個比喻,有三個桶,將數(shù)據(jù)按照一定規(guī)則(比如 n%3),分別放入三個桶,查找的過程就是先判斷在哪個桶里面
//然后再遍歷桶里面的數(shù)據(jù),查找在哪個桶里面就是hashcode函數(shù),遍歷該桶找到正確的數(shù)據(jù)浸踩,就是equals函數(shù)
//hashcode可以按照默認(rèn)的寫
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + month;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((species == null) ? 0 : species.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj.getClass() == Cat.class) {
Cat cat = (Cat)obj;
return cat.getName().equals(name)&&(cat.getMonth()==month )&&cat.getSpecies().equals(species);
}
return true;
}
}
package com.imooc.set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class CatTest {
public static void main(String[] args) {
Cat huahua = new Cat("花花",12,"英國短毛貓");
Cat fanfan = new Cat("凡凡",12,"中華田園貓");
Set<Cat> set = new HashSet<Cat>();
set.add(huahua);
set.add(fanfan);
//顯示寵物貓的信息
Iterator<Cat> it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());//對對象的輸出,自動調(diào)用toString方法
}
//再添加一個與花花屬性一樣的貓
Cat huahua01 = new Cat("花花",12,"英國短毛貓");
set.add(huahua01);
System.out.println("*****************");
System.out.println("添加重復(fù)數(shù)據(jù)后的信息");
//顯示寵物貓的信息
it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());//對對象的輸出统求,自動調(diào)用toString方法
}
//在沒有重寫hashCode和equals方法前检碗,是可以添加的,重寫后就不能添加了码邻。相比與String折剃,自定義的類需要去重寫
//重新插入一個新的寵物貓
System.out.println("*****************");
Cat huahua02 = new Cat("花花二代",2,"英國短毛貓");
set.add(huahua02);
System.out.println("添加花花二代后的寵物貓信息");
it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
System.out.println("*****************");
//在集合中查找花花的信息輸出(通過對象)
if(set.contains(huahua)) {
System.out.println("花花找到了");
}else {
System.out.println("花花沒找到");
}
//在集合中查找花花的信息輸出(通過名字)
Cat c = null;
boolean flag =false;
it=set.iterator();
while(it.hasNext()) {
c = it.next();//注意next得到的是Object 類型
if(c.getName().equals("花花")) {
flag = true;
break;
}
}
if(flag) {
System.out.println("花花找到了");
System.out.println(c);
}else {
System.out.println("花花沒找到");
}
// //刪除花花二代的信息并重新輸出
// System.out.println("*****************");
// for(Cat cat : set) {//使用增強(qiáng)型for遍歷
// if("花花二代".equals(cat.getName()))
// set.remove(cat);
// break;//在遍歷的時候,讀又刪除像屋,會出錯怕犁,應(yīng)該刪除了立刻break,這與c++中的迭代器類似
// }
// 對于要刪除多個元素的情況,顯然break是無效的
Set<Cat> set_del = new HashSet<Cat>();
for(Cat cat : set) {
if(cat.getMonth()<5)
set_del.add(cat);
}
set.removeAll(set_del);//刪除一個子集的內(nèi)容
System.out.println("刪除花花二代后:");
for(Cat cat:set) {
System.out.println(cat);
}
//刪除所有信息
System.out.println("*****************");
System.out.println("刪除所有信息:");
if(set.removeAll(set)) { //set.isEmpty()
System.out.println("刪除完畢");
}else {
System.out.println("刪除失敗");
}
}
}
輸出結(jié)果:
Cat [name=花花, month=12, species=英國短毛貓]
Cat [name=凡凡, month=12, species=中華田園貓]
添加重復(fù)數(shù)據(jù)后的信息
Cat [name=花花, month=12, species=英國短毛貓]
Cat [name=凡凡, month=12, species=中華田園貓]
添加花花二代后的寵物貓信息
Cat [name=花花, month=12, species=英國短毛貓]
Cat [name=凡凡, month=12, species=中華田園貓]
Cat [name=花花二代, month=2, species=英國短毛貓]
花花找到了
花花找到了
Cat [name=花花, month=12, species=英國短毛貓]
刪除花花二代后:
Cat [name=花花, month=12, species=英國短毛貓]
Cat [name=凡凡, month=12, species=中華田園貓]
刪除所有信息:
刪除完畢
注意:為了消除警告奏甫,可以采取泛型戈轿,限定Set中元素類型
Set<Cat> set = new HashSet<Cat>();
Iterator<Cat> it = set.iterator();
Cat c;
c = it.next();//注意next得到的是Object 類型,這里自動轉(zhuǎn)換成了Cat阵子,因此可以不加強(qiáng)轉(zhuǎn)c = (Cat)it.next();