Set:存入Set的每個(gè)元素都必須是唯一的,因?yàn)镾et不保存重復(fù)元素。加入Set的元素必須定義equals()方法以確保對(duì)象的唯一性。Set接口不保證維護(hù)元素的次序。Set接口有以下三個(gè)實(shí)現(xiàn)類:
1.HashSet : 為快速查找而設(shè)計(jì)的Set误堡。存入HashSet的元素必須定義hashCode()。(如果沒有其他限制雏吭,默認(rèn)應(yīng)該選擇這個(gè)Set)
2.TreeSet : 保持次序的Set锁施,底層為樹結(jié)構(gòu)。使用它可以從Set中提取有序的序列杖们。元素必須實(shí)現(xiàn)Comparable接口悉抵,按照排序順序維護(hù)元素,若不實(shí)現(xiàn)Comparable接口將會(huì)跑出異常摘完。
3.LinkedHashSet : 具有HashSet的查詢速度姥饰,內(nèi)部使用鏈表維護(hù)元素插入的順序。使用迭代器遍歷Set時(shí)孝治,結(jié)果會(huì)按元素插入的次序顯示列粪。元素也必須定義hashCode()方法,實(shí)際上使用迭代器遍歷時(shí)速度會(huì)比HashSet速度快谈飒,因?yàn)閮?nèi)部是鏈表岂座。
根據(jù)實(shí)驗(yàn)得出結(jié)論:
1.當(dāng)向HashSet中添加元素時(shí),HashSet會(huì)優(yōu)先比較元素的hashCode()方法的返回值杭措,若發(fā)現(xiàn)容器中有其他元素?fù)碛邢嗤膆ashCode()返回值费什,則會(huì)去執(zhí)行equals()方法是否是同一個(gè)元素,若equals()方法返回true,則不加入容器瓤介,若equals()返回false,則加入容器赘那。
SortedSet
SortedSet中的元素保證處于排序狀態(tài),TreeSet是目前唯一實(shí)現(xiàn)該接口的類刑桑。
該接口的一些方法:
1.Object first() 返回容器的第一元素
2.Object last() 返回容器的最末一個(gè)元素
3.SortedSet subSet(fromElement, toElement) 生成Set的子集,從fromElement(包含)開始帶toElement(不包含)
4.SortedSet headSet(toElement) 生成此Set的子集募舟,由小于toElement的元素組成
5.SortedSet tailSet(fromElement) 生成此Set的子集祠斧, 由大于或等于fromElement的元素組成
隊(duì)列
Queue在JavaSE5中僅有的兩個(gè)實(shí)現(xiàn)是LinkedList和PriorityQueue,
LikedList是普通隊(duì)列,實(shí)現(xiàn)先進(jìn)先出
PriorityQueue是優(yōu)先級(jí)隊(duì)列拱礁,在隊(duì)列中優(yōu)先級(jí)最高的元素將先從另一端出隊(duì)琢锋,優(yōu)先級(jí)排序通過實(shí)現(xiàn)Comparable接口實(shí)現(xiàn),元素將按照定義的comparaTo()方法定義的排序規(guī)則進(jìn)行排序呢灶。
/**
Person.java
*/
public class Person implements Comparable{
private String name;
private String sex;
private int age;
public Person(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public Person(String name) {
this.name = name;
}
public Person() {
}
public String getName() {
return name;
}
@Override
public boolean equals(Object obj) {
System.out.println("equals() methods is execute!" + this.toString());
if (obj instanceof Person){
Person person = (Person)obj;
if (this.name == person.getName()){
return true;
}else {
return false;
}
}else {
return false;
}
}
@Override
public int hashCode() {
System.out.println("hashCode() methods is execute!" + name);
return name.hashCode();
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
System.out.println("compareTo() methods is execute!" + this.toString() + " compareTo " + o.toString());
if (o instanceof Person){
Person person = (Person)o;
System.out.println(this.name.compareTo(person.getName()));
return this.name.compareTo(person.getName());
}else {
return -1;
}
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/**
測(cè)試
*/
PriorityQueue<Person> priorityQueue = new PriorityQueue<Person>();
priorityQueue.offer(new Person("aaaa"));
priorityQueue.offer(new Person("cccc"));
priorityQueue.offer(new Person("bbbb"));
for (int i = 0; i < 3; i++) {
System.out.println(priorityQueue.remove());
}