在日常的數(shù)據(jù)分析工作中,常常需要使用到集合來存儲和處理數(shù)據(jù)臭笆,因此需要對集合的分類和功能有所了解缭裆。Java的集合框架分為兩部分底挫,分別對應(yīng)兩大接口:Collection接口和Map接口。以下就通過這兩大接口開始講解淑际。這篇文章主要講Collection接口畏纲。
接口
先說說接口是什么,接口(英文:Interface)春缕,在JAVA編程語言中是一個抽象類型盗胀,是抽象方法的集合,接口通常以interface來聲明锄贼。一個類通過繼承接口的方式票灰,從而來繼承接口的抽象方法。
1、接口的聲明
/* 文件名 : Animal.java */
interface Animal {
public void eat();
public void travel();
}
2屑迂、接口的實現(xiàn)
當(dāng)類實現(xiàn)接口的時候浸策,類要實現(xiàn)接口中所有的方法。否則惹盼,類必須聲明為抽象的類庸汗。類使用implements關(guān)鍵字實現(xiàn)接口。
/* 文件名 : MammalInt.java */
public class MammalInt implements Animal{
public void eat(){
System.out.println("Mammal eats");
}
public void travel(){
System.out.println("Mammal travels");
}
public int noOfLegs(){
return 0;
}
public static void main(String args[]){
MammalInt m = new MammalInt();
m.eat();
m.travel();
}
}
collection接口涉及三種類型的集合:1.Set(規(guī)則集) 2.List(線性表) 3.Queue(隊列)
1手报、List接口
List的主要特征:
(1)有序(ordered):元素的存取是有序的蚯舱,保證了取出的元素的順序與輸入的元素順序保持一致。
(2)索引(index):允許用戶根據(jù)索引對元素進行精準(zhǔn)定位并進行查詢掩蛤、插入枉昏、刪除等操作。
(3)允許重復(fù):允許多個重復(fù)的元素存在盏档。
import java.util.*;
public class CollectionDemo {
public static void main(String[] args) {
// ArrayList
ArrayList<String> list = new ArrayList<String>(); // 父類接口List引用ArrayList
list.add("Hello");
list.add("World");
list.add("HAHAHAHA");
// 第一種遍歷方法使用 For-Each 遍歷 List
for (String str : list) { // 也可以改寫 for(int i=0;i<list.size();i++) 這種形式
System.out.println(str);
}
// 第二種遍歷凶掰,把鏈表變?yōu)閿?shù)組相關(guān)的內(nèi)容進行遍歷
// 創(chuàng)建數(shù)組:dataType[] arrayRefVar = new dataType[arraySize];
String[] strArray = new String[list.size()];
list.toArray(strArray);
for (int i = 0; i < strArray.length; i++) { // 這里也可以改寫為 for(String str:strArray) 這種形式
System.out.println(strArray[i]);
}
// 第三種遍歷 使用迭代器進行相關(guān)遍歷,該方法可以不用擔(dān)心在遍歷的過程中會超出集合的長度
Iterator<String> ite = list.iterator();
while (ite.hasNext()) { // 判斷下一個元素之后有值
System.out.println(ite.next());
}
// LinkedList
LinkedList<String> list2 = new LinkedList<String>();
list2.add("11");
list2.add("22");
list2.add("33");
for (String str : list2) {
System.out.println(str);
}
// Vector
Vector<String> list3 = new Vector<String>();
list3.add("111");
list3.add("222");
list3.add("333");
for (String str : list3) {
System.out.println(str);
}
}
}
2蜈亩、Set接口
Set的主要特征
(1)不允許重復(fù):元素不允許重復(fù)懦窘。Set在存儲元素時會通過hashCode()和equals()來保證元素的唯一性。
Set如何保證元素的唯一性:
Set在存儲元素時稚配,通過hashCode()和equals()來保證元素的唯一性畅涂。
事實上,當(dāng)存儲一個新的元素時道川,僅僅通過equals()來逐一判斷新元素是否與集合中已有的元素是否重合午衰,這種方法也是可行的,那為什么還需要hashCode()呢冒萄。因為當(dāng)Set中元素數(shù)量很多時臊岸,通過equals()逐一判斷并不是一個高效率的方法,所以同時通過hashCode()和equals()進行判斷可以提高判斷的效率尊流。
hashCode()是Object的類帅戒,每個對象都具有hashCode值。不同的對象可能會有相同的hashCode值崖技,但hashCode值不相同的兩個對象肯定不同逻住。
我們可以用映射的概念來理解對象與hashCode之間的關(guān)系,對象(value)與hashCode(key)構(gòu)成了多對一的映射迎献。
當(dāng)每次存儲新的元素時瞎访,首先通過hashCode()獲得新元素的hashCode,判斷是否與已有元素的hashCode相同吁恍。如果沒有扒秸,將新元素加入到集合中播演。如果有,再通過equals()判斷元素是否相同伴奥,如果相同宾巍,則不添加該元素,如果不同渔伯,則把該元素加到集合中顶霞。
2.1 HashSet
HashSet元素存儲的結(jié)構(gòu)是哈希表。
hashSet除了不允許重復(fù)元素外锣吼,還不能保證元素存取的順序选浑。
import java.util.*;
public class setDemo1 {
public static void main(String[] args) {
HashSet<String> hash = new HashSet<String>();
hash.add("11");
hash.add("22");
hash.add("33");
Iterator<String> it = hash.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " "); // 每次輸出的順序都不一樣
}
}
}
2.2 LinkedHashSet
LinkedHashSet的元素的存儲結(jié)構(gòu)是鏈表和哈希表。
LinkedHashSet保證了元素存取的順序玄叠。
LinkedHashSet遵循先進先出的順序
import java.util.*;
public class setDemo2 {
public static void main(String[] args) {
LinkedHashSet<String> lset = new LinkedHashSet<String>();
lset.add("11");
lset.add("22");
lset.add("33");
Iterator<String> it = lset.iterator();
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
}
}
TreeSet可以保證元素存取的順序