目錄
什麼是集合
為什麼要有集合
怎麼用集合
集合的特點
集合和數組之間的差別
Collection接口
Map接口
什麼是集合
集合和數組很像,是一個放置資料的容器,但他存放的都是java中最常見的東西:對象。
為什麼要有集合
程式總是在運作時才知道某些條件,進而去建立對象。但在這之前并不知道對象的數量與類型,也就不能依靠建立命名的引用來持有每一個對象,也就需要在任意時刻和任意位置建立任意數量的對象。那這些對象存哪呢?我們知道,存很多東西的時候,我們第一個想到的就是數組,但數組是靜态的,長度已定,是以不能符合我們建立任意數量的要求。咋整呢?于是乎集合應運而生~
怎麼用集合
集合的特點:
1,用于存儲對象的容器。
2,集合的長度是可變的。
3,集合中不可以存儲基本資料類型值。
集合有很多種,大類呢咱們可以分為:Collection集合和Map
為什麼這麼分呢?
Collection:是獨立元素的序列,就好像數組一樣,他是一個個的獨立的對象,比如說[cat,dog,fish],這就是一個集合,包含三個獨立對象。
Map:是一組成對的“鍵值對”對象,{鍵,值} 比如說{1,cat}{2,dog}{3,fish}。他有啥好的呢?Map又叫地圖,它允許你用鍵對象來尋找值對象,有點數組下标找數組内容的味道在裡面,也像字典裡用拼音來找字一樣,是以Map也叫“關聯數組”,“字典”。
那那麼張大圖,寫的都是啥呢?
我們可以看到,Collection和Map都寫着<<接口>>他們兩個是高度抽象出來的“爺爺”輩的人物,位高權重的,平時咱們可惹不起。
Collection底下分管着Queue接口(隊列)List接口(清單)和Set接口(集)三個得力幹将,咱們主要用的呢,都是得力幹将們的具體實作。
Map人丁沒那麼興旺,主要用的呢,就是TreeMap、HashMap、HashTable。
集合和數組之間的差別
1、數組可以存儲基本資料類型和引用資料類型(對象),但隻能存儲同一種。而集合隻能存儲引用資料類型(對象),但可以存儲不同類型的對象(但我們并不這樣做)。
2、數組是靜态的,一旦建立長度無法改變。集合容量是動态的,達到條件後可以對集合進行擴容。
3、底層實作不同,數組底層是順序表,而集合的底層實作有多種結構,比如順序表、散清單和樹等。
而具體的List、Set、Map一篇文章講不清楚,我們得分多幾篇文章來,結合源碼,慢慢說明白~
下面我們先講講頂層的接口,他們所具有的功能。
Collection接口
作為頂層Collection,它所具有的功能應該是提煉到了最極緻的,作為該類型集合(獨立序列)應該都需要擁有的功能,具體的實作呢,需要交給具體的結構咯。
咱們先從出生說起,集合作為“數組的補充”,他應該具備什麼功能呢?照搬一下數組,基礎屬性是必須的吧,增删改查是必須的吧,數組還能周遊,咱們也得周遊一下吧。
1、增
boolean add(Object obj):
boolean addAll(Collection coll):
看方法便知道,“增”操作起碼有兩種,一是增單個對象,二是将一整個集合都增加進來,最後傳回的就是“增”這個操作是否成功。
2、删
boolean remove(object obj):
boolean removeAll(Collection coll);
void clear();
“删”的前兩種情況和“增”大同小異,第三種clear是什麼呢?就是從該集合中删除所有元素,将集合徹底取空。
3、改
前面說過,Collection是獨立元素的序列,在[cat,dog,fish]中将fish改成rat,不就是删掉fish以後增加rat麼,是以
4、查
boolean contains(object obj):
boolean containsAll(Colllection coll);
boolean isEmpty():判斷集合中是否有元素。
下面是Collection所有的方法,咱們不一一贅述了。
來個例子~
public class DJ_CollectionDemo {
public static void main(String[] args) {
Collection coll = new ArrayList(); //ArrayList後面會說到滴,這裡可以先略過,直接看作Collection
show(coll);
}
public static void show(Collection coll) {
// 1.添加元素
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
System.out.println(coll);// [abc1, abc2, abc3] 列印集合會列印集合裡的所有值:一個字元串整體
// 2.删除集合
coll.remove("abc2");
System.out.println(coll);// [abc1, abc3] remove會改變集合長度
// coll.clear();
// System.out.println();// 無内容
// 判斷
System.out.println(coll.contains("abc4"));// false
System.out.println(coll.contains("abc1"));// true
}
public class DJ_CollectionDemo {
public static void main(String[] args) {
Collection c1 = new ArrayList();
Collection c2 = new ArrayList();
show(c1, c2);
}
//關于ALL類的
public static void show(Collection c1, Collection c2) {
// 給c1添加元素。
c1.add("abc1");
c1.add("abc2");
c1.add("abc3");
// 給c2添加元素。
c2.add("abc1");
c2.add("abc2");
c2.add("abc4");
//示範addAll
c1.addAll(c2);//将c2中的元素添加到c1中。
System.out.println(c1);//[abc1, abc2, abc3, abc1, abc2, abc4]
// 示範removeAll
boolean b = c1.removeAll(c2);//将兩個集合中的相同元素從調用removeAll的集合中删除。
System.out.println("removeAll:"+b);//true
System.out.println(c1);//[abc3]
// 示範containsAll
boolean b2 = c1.containsAll(c2);
System.out.println("containsAll:"+b2);//false
// 示範retainAll
c2.add("abc3");//c1通過removeAll已經隻剩abc3了。c2加一個以示範下面方法
boolean b3 = c1.retainAll(c2);// 取交集,保留和指定的集合相同的元素,而删除不同的元素。
// 和removeAll功能相反 。
System.out.println("retainAll:" + b3);//true
System.out.println("c1:" + c1);//[abc3]
}
5、擷取
int size():
Iterator iterator():
public class DJ_IteratorDemo {
public static void main(String[] args) {
Collection coll = new ArrayList();
coll.add("abc1");
coll.add("abc2");
coll.add("abc3");
coll.add("abc4");
System.out.println(coll); //[abc1, abc2, abc3, abc4]
//使用了Collection中的iterator()方法。 調用集合中的疊代器方法,是為了擷取集合中的疊代器對象。
Iterator it = coll.iterator();
while(it.hasNext()){
System.out.println(it.next()); //類似指針,一開始指向第一個,然後往下指
}
for(Iterator it2 = coll.iterator(); it.hasNext(); ){//優點:若疊代器用過以後就不用了,這種方法能省一點記憶體
System.out.println(it.next());
}
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());//java.util.NoSuchElementException
}
}
Map接口
那麼同理,Map接口也應該是作為“關聯數組”裡都需要的功能。有什麼呢?增删改查了解一下~
1、增
value put(key,value):傳回前一個和key關聯的值,如果沒有傳回null.
void putAll(Map<? extends K, ? extends V> m);
2、删
void clear():清空map集合。
value remove(key):根據指定的key翻出這個鍵值對。
3、改
default V replace(K key, V value);
default boolean replace(K key, V oldValue, V newValue)
4、判斷
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
5,擷取。
value get(key):通過鍵擷取值,如果沒有該鍵傳回null。
int size(): 擷取鍵值對的個數。
boolean containsKey(Object key); Map中是否包含此Key
boolean containsValue(Object value);Map中是否包含此Value
public class DJ_MapDemo {
public static void main(String[] args) {
Map<Integer, String> map=new HashMap<Integer, String>();
method(map);
}
public static void method(Map<Integer,String> map) {
//添加元素
System.out.println(map.put(8, "caidj"));//null
System.out.println(map.put(8, "chenp")); //caidj 存相同鍵,系統會覆寫
map.put(5, "value5");
map.put(2, "value2");
System.out.println(map);//{2=value2, 5=value5, 8=chenp}
System.out.println("******************");
//删除元素
System.out.println("remove:"+map.remove(2));//remove:value2
System.out.println(map);//{5=value5, 8=chenp}
System.out.println("******************");
//判斷
System.out.println("containskey:"+map.containsKey(5));
System.out.println("******************");//containskey:true
System.out.println("get:"+map.get(5));//get:value5
}
}
public class DJ_MapDemo {
public static void main(String[] args) {
Map<Integer, String> map=new HashMap<Integer, String>();
method_2(map);
}
public static void method_2(Map<Integer, String> map) {
map.put(8,"zhaoliu");
map.put(2,"zhaoliu");
map.put(7,"xiaoqiang");
map.put(6,"wangcai");
//取出map中所有的元素
//法一:
//原理:通過keySet方法擷取map中所有的鍵所在的Set集合,通過set的疊代器擷取每一個鍵
//再對每一個鍵擷取其對應的值即可
Set<Integer> keySet = map.keySet();
Iterator<Integer> iterator = keySet.iterator();
while(iterator.hasNext()) {
Integer keySet1 =iterator.next();
String string=map.get(keySet1);
System.out.println(keySet1+":"+string);
}
/*法二:entrySet
* 通過Map轉成set就可以疊代。
* 該方法将鍵和值的映射關系作為對象存儲到了Set集合中,而這個映射關系的類型就是Map.Entry(類型)
*/
/*
* Set<Map.Entry<Integer, String>> entrySet =map.entrySet();
* Iterator<Map.Entry<Integer, String>> iterator2=entrySet.iterator();
while(iterator2.hasNext()) {
Map.Entry<Integer, String> me = iterator2.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+"::::"+value);
}
*/
}
}