天天看點

集合架構Map與Collection: List、Set什麼是集合為什麼要有集合怎麼用集合集合和數組之間的差別Collection接口Map接口

目錄

什麼是集合

為什麼要有集合

怎麼用集合

集合的特點

集合和數組之間的差別

Collection接口

Map接口

什麼是集合

集合和數組很像,是一個放置資料的容器,但他存放的都是java中最常見的東西:對象。

為什麼要有集合

程式總是在運作時才知道某些條件,進而去建立對象。但在這之前并不知道對象的數量與類型,也就不能依靠建立命名的引用來持有每一個對象,也就需要在任意時刻和任意位置建立任意數量的對象。那這些對象存哪呢?我們知道,存很多東西的時候,我們第一個想到的就是數組,但數組是靜态的,長度已定,是以不能符合我們建立任意數量的要求。咋整呢?于是乎集合應運而生~

怎麼用集合

集合的特點:

1,用于存儲對象的容器。

2,集合的長度是可變的。

3,集合中不可以存儲基本資料類型值。

集合有很多種,大類呢咱們可以分為:Collection集合和Map

集合架構Map與Collection: List、Set什麼是集合為什麼要有集合怎麼用集合集合和數組之間的差別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所有的方法,咱們不一一贅述了。

集合架構Map與Collection: List、Set什麼是集合為什麼要有集合怎麼用集合集合和數組之間的差別Collection接口Map接口

來個例子~

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);

                               }

                */

              

        }

}