- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Java基礎之集合框架詳解
本節學(xué)習到的內容有以下5類(lèi),不分先后順序:
1.ArrayList
2.Vector
3.LinkedList
1.hashSet
2.treeSet
在集合沒(méi)有出現之前,使用對象數組來(lái)存儲對象,但是,對象數組的長(cháng)度一旦確定,則不可以發(fā)生變化,所以我們希望存在一個(gè)容器就像StringBuffer一樣存儲字符串,同時(shí)依據傳入的值的個(gè)數不同,可以自動(dòng)改變自身的長(cháng)度,有這樣的東西嗎?有的,Collection就出現了,總結一下它的特點(diǎn):
(1)長(cháng)度區別
集合的長(cháng)度可以變化,數組無(wú)法變化
(2)內容不同
(3)存儲元素類(lèi)別的區別
集合一般使用到的功能有:
retainAll方法中,是再求A、B個(gè)集合的交集,返回的boolean類(lèi)型值說(shuō)明,前面的A集合是否發(fā)生過(guò)變化。
在集合中存儲字符串后,遍歷可以通過(guò)兩種方式實(shí)現:
這里我們先使用迭代器遍歷集合,如下:
package my_work; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class IteratorAndString { public static void main(String[] args) { Collection col = new ArrayList(); col.add("Hello"); col.add("World"); col.add("Java"); Iterator it = col.iterator(); while (it.hasNext()){ String s = (String)it.next();// 疑問(wèn) System.out.println(s); //System.out.println(it.next());注意:使用的這個(gè)方法是不安全的 } } }
這里為什么在取出元素之后需要強制轉型為String類(lèi)型?難道我不知道我存儲的是什么嗎?
回答:因為默認的迭代器中返回的元素類(lèi)型默認是Object類(lèi)的,為了避免之后的報錯,最好將它強制轉換,這個(gè)可以從原碼中得到答案:
public Object next(){} //迭代器中next()方法返回的是一個(gè)next對象。
(1)案例演示:「IteratorDemo.java」
案例中使用到的迭代器成員方法:
使用這兩個(gè)功能,就可以完成迭代器從集合中遍歷元素。
(2)將Collection轉換為數組后,使用For循環(huán)的遍歷
package my_work; import java.util.ArrayList; import java.util.Collection; public class CollectionToArray { public static void main(String[] args) { Collection c = new ArrayList(); c.add("Hello"); c.add("World"); c.add("Java"); Object[] objArray = c.toArray(); for (int x= 0;x<objArray.length;x++){ String s = (String)objArray[x]; System.out.println(s); } } }
* A:添加功能 * void add(int index,Object element):在指定位置添加元素 * B:獲取功能 * Object get(int index):獲取指定位置的元素 * C:列表迭代器 * ListIterator listIterator():List集合特有的迭代器 * D:刪除功能 * Object remove(int index):根據索引刪除元素,返回被刪除的元素 * E:修改功能 * Object set(int index,Object element):根據索引修改元素,返回被修飾的元素 */
List集合特有的遍歷,使用到size()方法和get()方法
package my_work; /** * 使用list中的size()方法與get()方法遍歷列表*/ import java.util.ArrayList; import java.util.List; public class ListDemo { public static void main(String[] args) { List list = new ArrayList(); list.add("Hello"); list.add("Java"); list.add("World"); for (int x=0;x<list.size();x++){ //System.out.println(list.get(x)); // 推薦做法 String s = (String)list.get(x); System.out.println(s); } } }
package my_work; import java.util.ArrayList; import java.util.List; public class ListAndFor { public static void main(String[] args) { List list = new ArrayList(); list.add("hello"); list.add("world"); list.add("java"); for (int x = 0; x < list.size(); x++) { String s = (String) list.get(x); System.out.println(s); } } }
package my_work; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class ListAndUserObject { public static void main(String[] args) { List list = new ArrayList(); Student s1 = new Student(18, "wzy"); Student s2 = new Student(19, "wzy"); Student s3 = new Student(20, "wzy"); list.add(s1); list.add(s2); list.add(s3); list.add(new Student(24, "wzy")); // 遍歷方式1:while Iterator it = list.iterator(); while (it.hasNext()) { Student s = (Student) it.next(); System.out.println(s.getAge() + "- - - " + s.getName()); } // 遍歷方式2:size與get for (int x = 0; x < list.size(); x++) { Student stu = (Student) list.get(x); System.out.println(stu); } } }
出現在當迭代器對進(jìn)行遍歷時(shí),我想在程序中加入一個(gè)判斷,如果這個(gè)判斷成立,則在集合中添加一個(gè)新的元素,這時(shí)就會(huì )出現并發(fā)修改異常錯誤ConcurrentModificationException:
如何解決?
(1)在循環(huán)中使用List類(lèi)特有的迭代器ListIterator()添加新的元素,如下:
package my_work; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListExcepiton { public static void main(String[] args) { List list = new ArrayList(); list.add("Hello"); list.add("world"); list.add("java"); ListIterator lit = list.listIterator(); while (lit.hasNext()){ if ("world".equals(lit.next())){ lit.add("JavaSE"); } } System.out.println(list); // [Hello, world, JavaSE, java],雖然是在迭代器中添加,但是,也會(huì )在最終的打印環(huán)節顯示。 } }
(2)使用普通的for循環(huán),在list里直接添加
package my_work; import java.util.ArrayList; import java.util.List; public class ListExceptionFor { public static void main(String[] args) { List list = new ArrayList(); list.add("Hello"); list.add("world"); list.add("java"); for (int x = 0; x < list.size(); x++){ if ("world".equals(list.get(x))){ list.add("JavaSE"); } } System.out.println(list); } }
(1)棧:
就像一個(gè)步槍彈匣,出口和入口為同一個(gè),遵循先進(jìn)后出原則,進(jìn)出對應著(zhù)入棧和彈棧
(2)隊列:
隊列就像隧道里的汽車(chē),遵循先后規則進(jìn)出,入口與出口不共用
(3)數組:
存儲同一種數據類(lèi)型的容器,具備索引下標,但是刪除指定元素和增加指定元素耗時(shí),查詢(xún)快,增刪慢
(4)鏈表:
鏈表和結點(diǎn)一起出現;
鏈表:將結點(diǎn)串起來(lái)的鏈子,使用地址值充當這個(gè)串起來(lái)的鏈子;
結點(diǎn):結點(diǎn)中存儲著(zhù)地址與數據,多個(gè)節點(diǎn)之間的地址存放總是相互關(guān)聯(lián)的;
鏈表也分為雙向鏈表、單向鏈表…
鏈表的存儲快,刪除快,查詢(xún)慢。
(1)ArrayList:底層數據類(lèi)型是數組結構,增刪慢,查詢(xún)快,線(xiàn)程不安全,執行效率高;
(2)Vector:底層數據類(lèi)型是數組結構,增刪慢,查詢(xún)快,線(xiàn)程安全,執行效率低;
(3)LinkedList:底層數據結構是鏈表,增刪快,查詢(xún)慢,線(xiàn)程不安全,執行效率高
有關(guān)List的使用,
(1)在存儲需求出現時(shí),優(yōu)先考慮LinkedList;
(2)在查詢(xún)需求出現時(shí),優(yōu)先考慮ArrayList;
Vector類(lèi)一般不使用,它出現在JDK1.0,古老的玩意,ArraysList的出現就是為了代替Vector類(lèi),雖然說(shuō)Vector是List的兒子,但是兒子和兒子之間,Vector卻是LinkedList和ArrayList的爺爺;
到此這篇關(guān)于Java基礎之集合框架詳解的文章就介紹到這了,更多相關(guān)Java集合框架內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站