日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Day15 --框架集合 Collection集合 和 List 集合

發布時間:2024/3/12 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Day15 --框架集合 Collection集合 和 List 集合 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
a.
????對象數組 --自定義對象類
????????概述
????????????* 創建一個自定義類用于存儲學生信息,并且獲取到每個學生信息 。
????????使用
????????????Student[] s = new Student[5];????//創建student類,用于存儲數組對象。
????????????s[0] = new Student("hah", 2);????//第一個Student數組的元素,且每個地址值有所不同
????????????s[1] = new Student("fas", 4);????// 數組中存儲的元素記錄的都是地址值,通過每個地址值找到一個個的new的元素對象。
????????????s[2] = new Student("fasd",34);
????????????s[3] = new Student("we", 43);
????????????s[4] = new Student("ad", 23);
????????????for (int i = 0; i < s.length; i++) {
????????????????System.out.println(s[i]);
????????????}?
?????????????????????
????????注意
????????????* 數組和集合存儲 引用數據類型 的時候,存儲都是地址值,且每個地址值都有所不同,通過地址值來查找每個元素對象。
????????????* 自定義對象數組中 存儲的元素記錄的其實都是地址值,即每個元素對象的地址值。 通過每個索引地址值找到每個 new的元素對象。

b.
????集合
????????--由來
????????????* 前提:數組和集合都是容器。
????????????* 因為數組的長度是固定的,當添加的元素超過數組的長度需要對數組進行重新定義,這樣太麻煩。 所以Java在jdk1.2的時候為我們提供了集合類。集合:用于存儲任意對象,而且長度可以改變,是隨著元素的增加而增加,隨著元素的減少而減少的,即隨著元素個數的變化而變化。
????????????
????????--概述
????????????* 數組和集合都是容器。
????????????* 集合于jdk1.2時被提出,長度可改變,是隨著元素個數的變化而變化。
????????數組和集合區別
????????????* 可以從兩方面來說:A存儲的類型 和 B存儲的長度:
????????????* 區別:
????????????????區別1:
???????????????????* 數組既可以存儲基本數據類型,也可存儲引用數據類型。基本數據類型存儲的是值,而引用數據類型存儲的是地址值。
???????????????????* 集合只能存儲引用數據類型(對象)集合也可以存儲基本數據類型,但存儲的時候會自動裝箱變成對象,即int類型的100,存儲到集合中就變成了new Integer(100)。
????????????????區別2:
????????????????????* 數組的長度是固定的,不可自動增加。
????????????????????* 集合的長度是可變的,是根據元素個數的變化而變化。
????????????????????
????????--數組和集合什么時候使用
????????????* 如果元素個數固定,就用數組。
????????????* 如果元素個數未知,不是固定,就用集合。????--部分集合底層代碼還是用數組來實現的,如果超出了數組的范圍,就創建一個 大于前者的1.5倍長度的數組。增長后,將原數組變成垃圾,以此類推。
????
????
????--集合繼承體系關系圖????????
??????????????-Collection --單列集合根接口
??????????????????* List -存取有序,和數組相同。有索引,可存儲重復元素。
??????????????????????* ArrayList???底層 數組實現。?
??????????????????????* LinkedList??底層 鏈表實現。?
??????????????????????* Vector(jdk1.0) 底層 數組實現。 --已被ArrayList替代。 之所以和集合命名規則不同,是集合體系是jdk1.2時候被提出,而jdk1.0的時候已經有了Vector,因為Vector中的功能和集合一樣,所以讓Vector也實現了List接口并且并入到了集合體系中。
??????????????????* Set -存取無序,無索引,不可存儲重復元素。
??????????????????????* HashSet????????底層 Hash算法。????元素無序。
??????????????????????* LinkedHashSet 底層 鏈表結構,是set集合中唯一一個怎么存怎么取的集合,又因為是HashSet的子類,所以同樣保證了元素的唯一性。
??????????????????????* TreeSet????????底層 二叉樹算法。 元素可以進行排序。
??????????????????????
??????????????-Map????--雙列集合根接口
???????????????????* HashMap 底層 哈希算法。 保證鍵的唯一性。
???????????????????* TreeMap 底層 二叉樹。 鍵可以排序。
??????????????????????


c.
????Collection
????????--概述
????????????* Collection是所有 單列集合 的根類接口。
????????????* Map是所有 雙列集合 的根接口。
????????????* 集合是jdk1.2的時候提出。
????????????* 集合的命名都有一定的規范:底層是怎么實現的,前者單詞就是什么,后者是哪個繼承體系下的。后者單詞就是什么。
????????????如:
????????????????ArrayList 底層數組實現,屬于List集合下。
????????????????LinkedList 底層鏈表實現,所以List集合下。
????--體系結構圖:????????
????????Collection(單列集合根接口)
????????????* List(有序,有索引,可重復元素)
????????????????* ArrayList??數組實現。存取有序,和數組一樣。有索引,可存儲重復元素。
????????????????* LinkedList 鏈表實現。
????????????????* Vector(jdk1.0) 數組實現。之所以和集合命名規則不同,是因為在jdk1.0時候出現,而集合體系是jdk1.2時候出現,已被ArrayList替代。
????????????* Set (無序,無索引,不可重復元素)
????????????????* HastSet 哈希算法。
????????????????* TreeSet 二叉樹算法。
????????????????
????????注意:List是一個不可插隊的插入對象。
????????


d.
????Collection集合的基本功能
????????概述
??????????* util包下,用時需導包。
??????????* Collection 是接口,用時只能:父類引用指向子類對象,即:????Collection c = new ArrayList();
??????????* Collection 單列集合 中的根接口。
??????????* Collection 表示一組對象,這些對象也稱為 collection 的元素。一些 collection 允許有重復的元素(list),而另一些則不允許(set)。一些collection 是有序的(list),而另一些則是無序的(set)。
??????????* JDK不提供此接口的任何直接 實現:它提供更具體的子接口(如 Set 和 List)實現。
????????常用方法
?????????* boolean add(Object obj);?????????添加對象 可添加任意對象。?????
?????????*?????????????????????????????????????????????結果Boolean永遠都是true。那什么時候是false? 只有當set集合存儲重復元素的時候,返回false。
?????????*?????????????????????????????????????????????所以一般我們不用返回值類型,自己將對象添加到集合中即可。即:c.add("sfa");
?????????*?
?????????* boolean remove(Object obj);?????刪除對象 可刪除任意對象。可以是基本數據類型,到時候會自動裝箱成對象。
?????????* void clear();?????????????????????清空集合元素
?????????* boolean contains(Object o);????????判斷是否包含指定元素
?????????* boolean isEmpty();????????????????判斷集合是否為空,為空就返回true,否則為false。
?????????* int size();????????????????????????獲取集合中的元素個數
?????????
????注意:1)add如果是List集合,就一直返回true,因為list集合中是可以存儲重復元素的。
?????????????如果是set集合用add存儲重復元素,就會返回false。
?????????2)ArrayList的父類的父類重寫了toString方法,所以在打印對象的引用時輸出的結果不是Object的??toString 的結果,而是集合特有的:[元素]的形式。

?????????collectionXxx.java使用了未經檢查或不安全的操作.
?????????注意:要了解詳細信息,請使用 -Xlint:unchecked重新編譯.
????????????java編譯器認為該程序存在安全隱患
????????????溫馨提示:這不是編譯失敗,所以先不用理會,等 學了泛型你就知道了




????toArray() 集合的遍歷之集合轉數組遍歷的功能
????????集合遍歷
????????????* 就是依次獲取集合中的每個元素。
????????????* 集合轉數組,就可以實現對集合的遍歷。
????????????* Object[] toArray(); 集合轉數組的方式就可以遍歷集合中的每個元素。
????????代碼
????????????//自定義 Bean對象 的遍歷方式。
????????????????????Collection c2 = new ArrayList(); //創建單列集合對象。
????????????????????c2.add(new Student("哈哈",23));??//等同于 Object o = new Student("哈哈",23);
????????????????????c2.add(new Student("嘻嘻",25));
????????????????????c2.add(new Student("么么",332));
????????????????????c2.add(new Student("啦啦",645));
????????????????????
????????????????????Object[] array2 = c2.toArray();
????????????????????for (int i = 0; i < array2.length; i++) {
?????????????????????????System.out.println(array2[i]); //獲取集合中所有的元素對象。
?????????????????????????
????????????//?????????????如果想獲取每個元素對象中的Name 或 age,就要向下轉型,即Object轉成Student對象。現在的array2[i] 就是Ojbect對象。
????????????//????????????(看左邊的類型,如果左邊是Object對象 就是向上轉型,如果左邊是Student對象,就是向下轉型)
?????????????????????????Student st =(Student)array2[i];????//向下轉型。將Object的array2轉成Student。
?????????????????????????System.out.println("姓名:"+st.getName()+"??年齡:"+st.getAge());
????????????????????}


????Collection集合中方法帶有All后綴的功能
????????????* boolean addAll(Collection c);????添加集合。
????????????????* 如:
????????????????????* c1集合有對象:abcd??c2集合有對象:ef
????????????????????* c1.addAll(c2); 將c2集合中的每個對象添加c1中,結果為:[a,b,c,d,e,f]
????????????????????* c1.add(c2); 將c2看做是一個整個對象添加到c1中,結果為:[a,b,c,d,[e,f]]
????????????????
????????????* boolean removeAll(Collection c);??刪除集合或刪除集合的元素,刪除的是兩個集合的交集為true,如果刪除的是兩個集合沒有的交集,就是false。
????????????* boolean containsAll(Collection c); 是否一個集合包含另一個集合的所有元素。如果全包含就為true,否之為false。
????????????* boolean retainAll(Collection c);??取出兩個集合之間的交集。
????????????????* 注意:如果調用的集合改變就返回true, 如果調用的集合沒有改變就返回false。
?????????????????????如:
?????????????????????????1) c1集合有:abcd?????c2集合有 ab????c1.retainAll(c2);??取交集c1結果為:ab,c1改變了,所以返回true。?????
?????????????????????????2) c1集合有:abcd?????c2集合有 z?????c1.retainAll(c2);??取交集c1結果為:[], 但c1還是改變,所以也返回true。
?????????????????????????3) c1集合有:abcd?????c2集合有 abcdefg?????c1.retainAll(c2);???取交集c1結果為:abcd,c1沒有改變,所以為false。
?????????????????????這就是retainAll的特殊之處,主要是 前者跟后者比較,前者的結果是否改變,如果改變就是true,如果沒變就是false。?????


????
????Collection集合的Iterator迭代器的遍歷方式
????????????概述
????????????????* 集合用于存儲元素,存儲的元素如果需要查看,就要使用迭代器的方式。
????????????使用
????????????????* 使用 Iterator 的方式來迭代。
????????????????* 關鍵方法:
????????????????????* hasNext(); 判斷是否還有下一個元素,如果有就返回true。
????????????????????* next(); 返回迭代的下一個元素,即將集合中的元素取出。
????????????????????????* next具有將指針向下移一位的功能。


????Collection存儲自定義對象并遍歷
????????????Collection c = new ArrayList(); // 創建集合對象。父類引用指向子類對象
????????????c.add(new Student("趙白石",43));??//等等于: Object??obj = new Student("趙白石",43); 即父類引用指向子類對象,obj不能使用子類特有的屬性和行為,即使用只能靠向下轉型的方式才能夠子類特有的屬性和行為。
????????????c.add(new Student("沈星移",33));
????????????c.add(new Student("周瑩",40));
????????????c.add(new Student("吳聘",42));
????????????
//????????方式一:while來做
????????/*????Iterator it = c.iterator();
????????????while(it.hasNext()){
????????????????Student st = (Student)it.next(); //向下強轉。 將it.next的Iterator的對象向下強轉成Student對象。只有向下轉型,才能使用子類特有的屬性和行為。
????????????????String name = st.getName();?
????????????????int age = st.getAge();
????????????????System.out.println("姓名:"+name+".....年齡:"+age);
????????????}*/
//【注意:向下轉型,才能使用子類特有的屬性和行為】
????????????
//????????方式二:for循環來做
????????for (Iterator it = c.iterator(); it.hasNext();) {
????????????????Student s = (Student)it.next();??//向下強轉。將it.next的Iterator的對象向下強轉成Student對象。這樣就能獲取子類特有的屬性和行為。
????????????????System.out.println(s.getName()+"..."+s.getAge());
????????}
????}

????--迭代器的原理及源碼解析
?????????原理????
?????????????迭代器是對集合進行遍歷的,而每個集合內部的存儲結構都是不同,所以每個集合的存和取的方式也都不同的。那么就需要在每一個類中都去定義hasNext()方法 和 next()方法,這樣做可以方便的判斷是否有下一個元素和返回集合中的當前元素。但是這樣整個集合體系看起來就會過于臃腫。所以就將迭代器向上抽取出一個接口,然后在每個類的內部去定義自己的迭代方式。 這樣做的好處有二:
?????????????第一:規定了整個集合體系的遍歷方式通過通過hasNext()和next()方法來實現的。第二:代碼由底層內部實現,使用者無需關心怎么實現的,會用即可。

????????迭代器的原理:
????????迭代器是用來遍歷集合。因為集合的底層數據結構不同,就導致集合存取元素的方式不同,如果每個集合類都定義自己的存取方式,這樣做是可以的,但是會讓整個繼承體系很冗余,臃腫。所以我們經過不斷的向上抽取,最終定義成了接口。
????????這樣做的好處有兩個:
????????????A:更規范。
????????????B:我們不用管底層是怎么實現,只要會用就可以了。
????????
????????
????????迭代器源碼解析
??????????????* 1,在eclipse中ctrl + shift + t找到ArrayList類
??????????????* 2,ctrl+o查找iterator()方法
??????????????* 3,查看返回值類型是new Itr(),說明Itr這個類實現Iterator接口
??????????????* 4,查找Itr這個內部類,發現重寫了Iterator中的所有抽象方法?
????????????
????????Iterator iterator(); 該對象必須依賴具體的集合容器,因為每個集合容器的內部數據結構不同,所以該迭代器對象是在集合容器中進行內部實現的,也就是說iterator()方法在每個集合容器中的實現方式時不同的。
????????對于調用者來說,具體的實現過程無需知道,只要通過該集合容器獲取到該實現的迭代器對象即可,也就是iterator方法。
????????Iterator接口就是對所有單列集合根接口Collection容器進行元素取出的公共接口。????


e.
????List集合?
????????概述
????????????*??List是一個接口,在util包下,使用的話,只能父類引用指向子類對象,如下:
????????????????????* List i = new ArrayList(); 但這樣做存在弊端,不能使用子類特有的屬性和方法。
????????????????????* 建議:ArrayList al = new ArrayList();????// 這樣寫。直接new對象即可直接使用子類屬性和方法。
????????????????????* 因為多態當 [參數] 用是比較合適。因為可以更好的擴展代碼功能。
????????????* 有序集合,有索引,可存儲重復元素。
????????????* ArrayList底層 數組實現。
????????????
????????方法
????????????* void add(int index, E element); 在集合的指定索引位置上添加E對象。E表示泛型表示任意對象。
????????????????* 注意:
????????????????????* 當添加時使用不存在的索引,就會出現:IndexOutOfBoundsException 角標越界異常。
????????????????????* 添加的索引是: index<=size 并且index>=0 在這個范圍內 就都不會出錯報異常。
????????????* E remove(int index); 通過集合的索引刪除元素,將被刪除的元素返回。
????????????*?????*??remove的過程不會將索引自動裝箱成對象。
????????????* E get(int index);??獲取集合指定索引上的元素對象。
????????????????* get(int index)方法可作為for循環變量集合的其中一個條件,配合size()方法便可遍歷出具體集合元素對象。?????????
????????????* E set(int index, E element); 設置集合索引上的元素。
????????????* int indexOf(Object o); 返回此列表中第一次出現指定元素的索引位置,如果沒有就返回-1
????????????* List subList(int fromIndex. int toIndex);????返回列表中從指定位置開始到指定位置結束之間的部分視圖。含頭不含尾的。
????????????

????List集合的遍歷
????????概述
????????????* 通過get() 和 size()方法結合使用遍歷。
????????????* 代碼
????????????????List list = new ArrayList(); //創建集合對象。
????????????????list.add(new Student("aa",33)); //添加Student元素對象,等于 Ojbect o = new??Student("aa",33)
????????????????list.add(new Student("bb",23));
????????????????list.add(new Student("cc",13));
????????????????//遍歷集合,使用size()和get()方法去遍歷。
????????????????for(int i=0;i<list.size();i++){
????????????????????Object obj = list.get(i); //獲取每個集合元素對象。
????????????????????sop(obj);
????????????????????//如果想獲取具體Student對象的name和age屬性,就要向下強轉對象,再獲取。因為父類不能使用子類特有的屬性和行為。
????????????????????Student st = (Student)obj; //向下強轉對象。
????????????????????sop(st.getName()+"..."+st.getAge());
????????????????}



????List集合 --并發修改異常產生的原因及解決方案
????????* 需求
????????????* 我有一個集合,請問,我想判斷里面有沒有"world"這個元素,如果有,我就添加一個"javaee"元素,請寫代碼實現。
????????
????????* 問題出現
????????????* 如果使用Iterator普通迭代器 來遍歷集合且同時添加元素對象時,就會出現 并發修改異常,即ConCurrentModificationException。
????????????* 當使用Iterator普通迭代器 來作為遍歷的方式時,一邊遍歷元素對象并且一邊添加元素對象,就會出現這樣的異常。
????????
????????* 解決方案
????????????* 使用List集合特有的一種迭代方式:ListIterator。
????????????* ListIterator迭代器可以 一邊遍歷集合,一邊使用ListIterator迭代器可以特有的add方法添加元素(不是ArrayList的add方法),這樣才不會有 并發修改異常 的出現。
????
????????
?????List集合中特有的迭代器 ListIterator 的了解:
????????* boolean hasNext(); 正向順序判斷是否還有下一個元素。
????????* boolean hasPrevious(); 逆向順序判斷是否還有前一個元素。
????????* Object next(); 正向順序返回下一個元素。
????????????* next()獲取元素并將指針向后移動一次。?????
????????* Object previous(); 逆向順序返回上一個元素。????????????
????????????* previous()獲取元素并將指針向前移動一次?????
????注意:必須先有正向遍歷,才可以逆向遍歷。????
????



????Vector(1.0)
????????概述
????????????* 有序集合,在util包下,是一個類。
????????????* 在jdk1.2出現后的集合體系將Vector并入里面,且用 ArrayList代替這個集合了。
????????????* 底層 數組實現。
????????????* 同樣具有 Iterator 迭代器,但該迭代器不是自己的,而是從父類接口List繼承下來的。
????????????* 他有自己遍歷集合的方式:Enumeration
????????
?????特有功能
????????????* void addElement(E obj); 在沒有并入集合系統時,使用的是這個方法添加元素,當并入以后就是用 add() 去添加元素。
????????????* E elementAt(int index); 在沒有并入集合系統時,使用的是這個方法添加元素,當并入以后就是用 nextElement() 去添加元素。
????????????* Enumeration elements(); 獲取枚舉 等同于 Iterator迭代器。
????????????




【遍歷集合的幾種方式】
list
????* 使用 toArray() 集合轉數組的方式 + 普通for循環。
????* 使用 List中的 size() 和 get(int index) 的方式for循環獲取集合元素。
????* 使用 Iterator迭代器, 直接遍歷集合獲取元素,如果普通迭代器 一邊遍歷集合元素,一邊添加元素,這樣會一定出現:并發修改異常:ConcurrentModificationException。
????* 使用 List集合中特有的:ListIterator迭代器,一邊遍歷集合元素,一邊使用ListIterato特有的add()方法添加(修改)元素的方式,這樣就不會出現 并發修改異常。

vector
????* Iterator迭代器
????* Vector vec = new Vector(); Enumeration ele = vec.elements(); 獲取枚舉的方式。




f.
????數組結構之數組和鏈表 2017/10/5 0:24:53?
????????概述
????????????* 底層:數組 --ArrayList,Vector
????????????????* 查詢快,修改快,但增刪慢。(這些都是相對而言的)
????????????????
????????????* 底層:鏈表 --LinkedList
????????????????* 查詢慢,修改慢,但增刪快。
解析:
????--集合中的 底層:數組結構 是怎樣的一個流程??
????????????* 因為部分集合底層結構是由 數組 來實現的,所以會在底層創建一個數組為10的初始長度,如果要存儲的數據超過了這個數組初始長度時即11個時,會再創建一個比原來大50%的數組長度,將原數組中的數據copy到這個新數組當中,將原數組扔掉...以此類推。 因為數組一旦創建,長度就不能被改變,所以隨著存儲數據的個數越多,數組的長度不夠用,就要創建更多的新數組,這樣會導致廢棄的舊數組越來越多成為垃圾,而占用內存空間。
????????????????* 底層結構:數組
????????????????????* 什么是數組?就是一個容器,里面規定了初始容量是多少的一個器皿。比如初始容量就是一個可以存儲10個元素的容器,這就是數組,數組一旦創建就不可被修改。
????????????????????
????????????????????????* 查詢快,修改快。是因為數組有索引,根據索引可以方便的 查找 和 修改 對應的數據。
????????????????????????
????????????????????????* 增刪慢。因為都要對索引對應的數據進行操作,所以慢,如下:。
????????????????????????????* 增加慢,如:在索引2的位置上添加一個元素E,就要將索引2包含2的元素整體往后移動一位。將索引2的元素置出,并放入新添加的E元素。
????????????????????????????* 刪除慢,如:將索引3的元素刪除,就是將3+1的索引位置開始往后的元素往前移動一位,移動的最末尾的那個空出來的索引上的元素置為null即可。
????????????????????????????
????--集合中的 底層:鏈表結構 是怎樣的一個流程??????????????????????????
????????????????????* 底層結構:鏈表
????????????????????????* 什么是鏈表? 比如就是一段段自行車的小鏈條。 他們的鏈接就是通過 中間鏈條記錄住前面鏈條的地址值,和再記錄住后面鏈條的地址值,通過這樣的形式將鏈串聯起來,就是鏈表。
????????????????????????* 前提?鏈表不像數組是一個容器有規矩的索引編號,增和刪 索引都要變化。而鏈表只是通過記錄前后地址值來排列索引而記錄數據。
????????????????????????????* 增加快。所以如果想添加一個元素,可在任意的鏈條中間添加即可,但增加的同樣要記錄住它前后的元素的地址值,從而形成一個新的鏈表。
????????????????????????????* 刪除快。如果想刪除一個元素,直接刪除,刪除后的其他兩個的前后重新拼接一個新的中間鏈條即可。
????????????
????????????????????????????* 查詢慢:因為要先判斷要查找的元素距離開頭近還是末尾近,確定后。再通過Next(下一個)還是previous(前一個)的方式查詢,這樣對比數組直接通過拿索引找元素肯定會慢些。
????????????????????????????* 修改慢:因為要先判斷要查找的元素距離開頭近還是末尾近,確定后。再通過Next(下一個)還是previous(前一個)的方式查詢,查到后再修改。這樣對比數組直接通過拿索引找到元素并修改它肯定會慢些。
????????????????????????????
????????????????????????????



List集合的三個子類的特點
????????概述????????
????????????* ArrayList
????????????????* 底層數據結構:數組。因為是數組,所以:查詢快,修改快。但增刪慢。
????????????????* 它是 線程不安全 的,不同步。所以操作速度快,效率高。(最后通過StringBuilder來記錄元素)
????????????* Vector
????????????????* 底層數據結構:數組。因為是數組,所以:CURD都慢。
????????????????* 它是 線程安全 的,同步。所以操作速度慢,效率低。
????????????* LinkedList
????????????????* 底層數據結構:鏈表,因為是鏈表,所以:查詢慢,修改慢,但增刪快。
????????????????* 它是 線程不安全,不同步,所以執行效率高。

????????????Vector要比ArrayList查詢慢,因為Vector是線程安全的。
????????????Vector要比LinkedList增刪慢,因為Vectory是數組結構的,LinkedList是鏈表結構的,鏈表結構增刪快,數組增刪慢。

Vector和ArrayList的區別
????????????* Vector是 線程安全,所以執行效率低。
????????????* ArrayList是 線程不安全的,所以執行效率高。
????????????* 共同點:底層都是 數組 實現的。????
????
ArrayList和LinkedList的區別?
????????????* ArrayList底層是 數組結構,所以查詢快,修改快,增刪慢。
????????????* LinkedList底層是 鏈表結構,所以查詢慢,修改慢,增刪快。

????????單列集合Collection下的List有三個子類,我們到底使用誰?
????????????* 查改多,用ArrayList
????????????* 增刪多,用LinkedList
????????????* 如果都多,就用ArrayList。

????

【線程安全,意味著有 鎖。】






【面試題】????

?????1、集合的繼承體系結構?
????總:
????????集合體系有兩大部分: 單列集合Collection??雙列集合Map
????分:
????????單列結構Collection 下有 List 和 Set
????????????List 有序 有索引,可存儲重復元素。
????????????????* List下有三個子類
????????????????????* ArrayList
????????????????????????* 底層結構:數組。查詢快,修改快,增刪慢。
????????????????????????* 線程不安全的,執行效率高。
????????????????????* LinkedList
????????????????????????* 底層結構:鏈表。查詢慢,修改慢,增刪快。
????????????????????????* 線程不安全的,執行效率高。
????????????????????* Vector
????????????????????????* 底層結構:數組,查詢快,修改快,增刪慢。
????????????????????????* 線程安全的,執行效率低。
????????????Set??無序,無索引,不可存儲重復元素。


????總:


?????2、數組和集合區別?
????????數組,既可以存儲基本數據類型,也可存儲引用數據類型,當存儲基本數據類型存儲的是值,存儲引用數據類型時存儲的是地址值。
????????而集合,只能存儲引用數據類型(對象),當集合存儲基本數據類型時,會自動裝箱封裝為對象。(如:int變成Integer對象, char變成Character對象,boolean變Boolean對象)
????????
????????數組的長度是固定的,一旦初始化不可更改,不可增長。
????????集合的長度是可變的,可以根據元素的增長而增長,隨著元素的減少而減少 --(由元素個數決定)。

?????3、如何獲取字符串、數組、集合的長度?
????????????* 字符串: "".length();
????????????* 數??組: Length屬性;
????????????* 集??合: size()方法;



???4、遍歷集合有哪幾種方式?
????????List
????????????1) 使用 toArray() 將集合轉數組的方式 + 普通for循環。
????????????2) 使用 List中size()和get(int index)的方法for循環獲取集合元素。
????????????3) 使用 Iterator迭代器,直接遍歷集合獲取元素。如果使用普通迭代器Iterator 來一邊遍歷集合元素,一邊添加集合元素。一定會出現:并發修改異常。即:ConcurrentModificationException
????????????4) 使用 List中特有的ListIterator 迭代器,就可以一邊遍歷集合元素,一邊使用ListIterator中特有的add方法添加元素,這樣就不會有 并發修改異常 的出現。?
??????????
????????Vector
????????????1) 使用 Iterator迭代器、
????????????2) Vector vec = new Vector(); Enumeration e = evc.elements(); 獲取枚舉的方式。

???5、什么時候用數組?什么時候用集合?
????????查改多,用ArrayList
????????增刪多,用LinkedList
????????如果都多,用ArrayList


???6、來說說你對 ArrayList、LinkedList、Vector的理解?

總結

以上是生活随笔為你收集整理的Day15 --框架集合 Collection集合 和 List 集合的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。