摘要:集合的長度的是可變的,可以根據(jù)元素的增加而增長。如果元素個數(shù)不是固定的推薦用集合。線程安全,效率低。相對查詢慢線程安全的相對增刪慢數(shù)組結(jié)構(gòu)底層數(shù)據(jù)結(jié)構(gòu)是鏈表,查詢慢,增刪快。線程不安全,效率高。
1_對象數(shù)組的概述和使用
A:案例演示
需求:我有5個學生,請把這個5個學生的信息存儲到數(shù)組中,并遍歷數(shù)組,獲取得到每一個學生信息。
import net.allidea.bean.Student; public class Colletion_1_Array { public static void main(String[] args) { // int[] arr = new int[5]; //創(chuàng)建基本數(shù)據(jù)類型數(shù)組 Student[] arr = new Student[5]; //創(chuàng)建引用數(shù)據(jù)類型數(shù)組 arr[0] = new Student("張三", 23); //創(chuàng)建一個學生對象,存儲在數(shù)組第一個位置 arr[1] = new Student("李四", 24); arr[2] = new Student("王五", 25); arr[3] = new Student("趙六", 26); arr[4] = new Student("馬哥", 20); for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); //toString } } }
B:畫圖演示
把學生數(shù)組的案例畫圖講解
數(shù)組和集合存儲引用數(shù)據(jù)類型,存的都是地址值
2_集合的由來及集合繼承體系圖
A:集合的由來
數(shù)組長度是固定,當添加的元素超過了數(shù)組的長度時需要對數(shù)組重新定義,太麻煩,java內(nèi)部給我們提供了集合類,能存儲任意對象,長度是可以改變的,隨著元素的增加而增加,隨著元素的減少而減少 。
B:數(shù)組和集合的區(qū)別
區(qū)別1 :
數(shù)組既可以存儲基本數(shù)據(jù)類型,又可以存儲引用數(shù)據(jù)類型,基本數(shù)據(jù)類型存儲的是值,引用數(shù)據(jù)類型存儲的是地址值
集合只能存儲引用數(shù)據(jù)類型(對象)集合中也可以存儲基本數(shù)據(jù)類型,但是在存儲的時候會自動裝箱變成對象。
區(qū)別2:
數(shù)組長度是固定的,不能自動增長。
集合的長度的是可變的,可以根據(jù)元素的增加而增長。
C:數(shù)組和集合什么時候用
1,如果元素個數(shù)是固定的推薦用數(shù)組。
2,如果元素個數(shù)不是固定的推薦用集合。
D:集合繼承體系圖
Collection(單列集合的根接口)
List(有序,存取順序一致,有索引,可以重復存儲)
ArrayList(數(shù)組實現(xiàn))
LinkedList(鏈表實現(xiàn))
Vector(1.0數(shù)組實現(xiàn))
Set(無序,不一致,無索引,不可重復存儲)
HashSet(哈希算法)
TreeSet(二叉樹算法)**
3_Collection集合的基本功能測試
A:案例演示
基本功能演示
boolean add(E e)
boolean remove(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()
B:注意:
collectionXxx.java使用了未經(jīng)檢查或不安全的操作.
注意:要了解詳細信息,請使用 -Xlint:unchecked重新編譯,java編譯器認為該程序存在安全隱患,溫馨提示:這不是編譯失敗,所以先不用理會,等學了泛型你就知道了。
add方法如果是List集合一直都返回true,因為List集合中是可以存儲重復元素的,如果是Set集合當存儲重復元素時候,就會返回false
ArrayList的父類的父類重寫toString方法,所以在打印對象的引用的時候,輸出的結(jié)果不是Object類中的toString結(jié)果
import java.util.ArrayList; import java.util.Collection; import net.allidea.bean.Student; @SuppressWarnings({ "rawtypes", "unchecked" }) public class Colletion_2_demo { public static void main(String[] args) { // addDemo(); Collection c = new ArrayList(); //父類引用指向子類對象 c.add("a"); c.add("b"); c.add("c"); c.add("d"); c.add("e"); // c.remove("b"); //刪除指定元素 c.clear(); //清空集合 // System.out.println(c); // System.out.println(c.contains("b"));//判斷是否包含 System.out.println(c.isEmpty()); //判斷是否為空 System.out.println(c.size()); //獲取元素的個數(shù) } private static void addDemo() { Collection c = new ArrayList(); //父類引用指向子類對象 boolean b1 = c.add("abc"); boolean b2 = c.add(true); //自動裝箱new Boolean(true); boolean b3 = c.add(100); boolean b4 = c.add(new Student("張三",23)); // boolean b5 = c.add("abc"); System.out.println(b1); System.out.println(b2); System.out.println(b3); System.out.println(b4); System.out.println(b5); System.out.println(c.toString()); } }4_集合的遍歷之集合轉(zhuǎn)數(shù)組遍歷
A:集合的遍歷
其實就是依次獲取集合中的每一個元素。
B:案例演示
把集合轉(zhuǎn)成數(shù)組,可以實現(xiàn)集合的遍歷
import java.util.ArrayList; import java.util.Collection; import net.allidea.bean.Student; @SuppressWarnings({ "rawtypes", "unchecked" }) public class Colletion_3_demo { public static void main(String[] args) { // demo1(); Collection c = new ArrayList(); //Object obj = new Student("張三",23); c.add(new Student("張三", 23)); c.add(new Student("李四", 24)); c.add(new Student("王五", 25)); c.add(new Student("趙六", 26)); Object[] arr = c.toArray(); //將集合轉(zhuǎn)換成數(shù)組 for (int i = 0; i < arr.length; i++) { // System.out.println(arr[i]); Student s = (Student)arr[i]; //向下轉(zhuǎn)型 System.out.println(s.getName() + "..." + s.getAge()); } } private static void demo1() { Collection c = new ArrayList(); c.add("a"); c.add("b"); c.add("c"); c.add("d"); Object[] arr = c.toArray(); //將集合轉(zhuǎn)換成數(shù)組 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }5_Collection集合的帶All功能測試
A:案例演示
帶All的功能演示
boolean addAll(Collection c)
boolean removeAll(Collection c)
boolean containsAll(Collection c)
boolean retainAll(Collection c)
import java.util.ArrayList; import java.util.Collection; @SuppressWarnings({ "unchecked", "rawtypes" }) public class Collection_4_demo { public static void main(String[] args) { // addAllDemo(); // removeAllDemo(); // containsAllDemo(); Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); // c2.add("z"); boolean b = c1.removeAll(c2);//取交集,如果調(diào)用的集合改變就返回true,如果調(diào)用的集合不變就返回false System.out.println(b); System.out.println(c1); } private static void containsAllDemo() { Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); // c2.add("a"); // c2.add("b"); c2.add("z"); boolean b = c1.containsAll(c2); //判斷調(diào)用的集合是否包含傳入的集合 System.out.println(b); } private static void removeAllDemo() { Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); c2.add("z"); boolean b = c1.removeAll(c2); //刪除的是交集內(nèi)容 System.out.println(b); System.out.println(c1); } private static void addAllDemo() { Collection c1 = new ArrayList(); c1.add("a"); c1.add("b"); c1.add("c"); c1.add("d"); Collection c2 = new ArrayList(); c2.add("aa"); c2.add("bb"); c2.add("cc"); c2.add("dd"); c1.addAll(c2); //將c2整體元素添加到c1中 c1.add(c2); //將c2看成一個對象添加到c1中 System.out.println(c1); } }6_集合的遍歷之迭代器遍歷
A:迭代器概述
集合是用來存儲元素,存儲的元素需要查看,那么就需要迭代(遍歷)
B:案例演示
迭代器的使用
Collection存儲自定義對象并用迭代器遍歷
import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import net.allidea.bean.Student; @SuppressWarnings({ "unchecked", "rawtypes" }) public class Collection_5_demo { public static void main(String[] args) { // demo1(); Collection c = new ArrayList(); c.add(new Student("張三",23)); //Object obj = new Student("張三",23); c.add(new Student("李四",24)); c.add(new Student("王五",25)); c.add(new Student("趙六",26)); c.add(new Student("田七",27)); /* for(Iterator it = c.iterator();it.hasNext();) { Student s = (Student)it.next(); //向下轉(zhuǎn)型 System.out.println(s.getName() + "," + s.getAge()); //獲取對象中的姓名和年齡 }*/ // 獲取迭代器 Iterator it = c.iterator(); while(it.hasNext()) { // System.out.println(it.next()); //System.out.println(((Student)(it.next())).getName() + "," + ((Student)(it.next())).getAge()); Student s = (Student)it.next(); //向下轉(zhuǎn)型 System.out.println(s.getName() + "..." + s.getAge()); } } private static void demo1() { Collection c = new ArrayList(); c.add("a"); c.add("b"); c.add("c"); c.add("d"); //對集合中的元素迭代(遍歷) Iterator it = c.iterator(); //獲取迭代器 /*boolean b1 = it.hasNext(); //判斷集合中是否有元素,有就返回true Object obj1 = it.next(); System.out.println(b1); System.out.println(obj1); boolean b2 = it.hasNext(); //判斷集合中是否有元素,有就返回true Object obj2 = it.next(); System.out.println(b2); System.out.println(obj2);*/ while(it.hasNext()) { System.out.println(it.next()); } } }7_迭代器的原理及源碼解析(了解)
A:迭代器原理
迭代器原理:迭代器是對集合進行遍歷,而每一個集合內(nèi)部的存儲結(jié)構(gòu)都是不同的,所以每一個集合存和取都是不一樣,那么就需要在每一個類中定義hasNext()和next()方法,這樣做是可以的,但是會讓整個集合體系過于臃腫,迭代器是將這樣的方法向上抽取出接口,然后在每個類的內(nèi)部,定義自己迭代方式,這樣做的好處有二,第一規(guī)定了整個集合體系的遍歷方式都是hasNext()和next()方法,第二,代碼有底層內(nèi)部實現(xiàn),使用者不用管怎么實現(xiàn)的,會用即可
B:迭代器源碼解析
1,在eclipse中ctrl + shift + t找到ArrayList類
2,ctrl+o查找iterator()方法
3,查看返回值類型是new Itr(),說明Itr這個類實現(xiàn)Iterator接口
4,查找Itr這個內(nèi)部類,發(fā)現(xiàn)重寫了Iterator中的所有抽象方法
8_List集合的特有功能概述和測試
A:List集合的特有功能概述
void add(int index,E element)
E remove(int index)
E get(int index)
E set(int index,E element)
import java.util.ArrayList; import java.util.List; public class List_1_demo { /* * A:List集合的特有功能概述 * void add(int index,E element) * E remove(int index) * E get(int index) * E set(int index,E element)*/ public static void main(String[] args) { // demo1(); // demo2(); // demo3(); // demo4(); demo5(); } private static void demo5() { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.set(1, "z"); System.out.println(list); //將制定位置的元素修改 } private static void demo4() { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); // Object obj1 = list.get(1); // System.out.println(obj1); //通過索引遍歷list集合 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } private static void demo3() { List list = new ArrayList(); list.add(111); list.add(222); list.add(333); list.remove(0); //刪除的時候不會自動裝箱,把111當索引 System.out.println(list); } private static void demo2() { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("c"); list.add("d"); Object obj = list.remove(1); //通過索引刪除元素,將被刪除的元素返回 System.out.println(obj); System.out.println(list); } private static void demo1() { List list = new ArrayList(); //開發(fā)時直接創(chuàng)建子類對象 list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add(1, "f"); //index <= size且>=零都可以 // list.add(1, "e"); // list.add(10,"z"); //使用不存在的索引時,索引越界異常java.lang.IndexOutOfBoundsException System.out.println(list); } }9_List集合存儲學生對象并遍歷
A:案例演示
通過size()和get()方法結(jié)合使用遍歷。
import java.util.List; import java.util.ArrayList; import net.allidea.bean.Student; @SuppressWarnings({ "unchecked", "rawtypes" }) public class List_2_demo { public static void main(String[] args) { List list = new ArrayList(); list.add(new Student("張三",23)); //Object obj = new Student("張三",23); list.add(new Student("李四",24)); list.add(new Student("王五",25)); list.add(new Student("趙六",26)); list.add(new Student("田七",27)); for (int i = 0; i < list.size(); i++) { //通過索引獲取每一個元素 // System.out.println(list.get(i)); Student s = (Student)list.get(i); System.out.println(s.getName() + "..." + s.getAge()); } } }10_并發(fā)修改異常產(chǎn)生的原因及解決方案
A:案例演示
需求:我有一個集合,請問,我想判斷里面有沒有"world"這個元素,如果有,我就添加一個"javaee"元素,請寫代碼實現(xiàn)。
List list = new ArrayList<>(); list.add("a"); //Object obj = new String(); list.add("b"); list.add("c"); list.add("world"); list.add("d"); list.add("e"); Iterator it = list.iterator(); //獲取迭代器 while(it.hasNext()) { String str = (String)it.next();//向下轉(zhuǎn)型 if("world".equals(str)) { list.add("javaee"); //遍歷的同時在增加元素,并發(fā)修改ConcurrentModificationException } System.out.println(list); }
B:ConcurrentModificationException出現(xiàn)
迭代器遍歷,集合修改集合
C:解決方案
a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
b:集合遍歷元素,集合修改元素
ListIterator lit = list.listIterator(); //獲取迭代器,list集合特有的 while(lit.hasNext()) { String str = (String)lit.next();//向下轉(zhuǎn)型 if("world".equals(str)) { // list.add("javaee"); //遍歷的同時在增加元素,并發(fā)修改ConcurrentModificationException lit.add("javaee"); } System.out.println(list); }11_ListIterator(了解)
boolean hasNext()是否有下一個
boolean hasPrevious()是否有前一個
Object next()返回下一個元素
Object previous();返回上一個元素
import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class List_4_ListIterator { public static void main(String[] args) { List list = new ArrayList(); list.add("a"); //Object obj = new String(); list.add("b"); list.add("c"); list.add("world"); list.add("d"); list.add("e"); ListIterator lit = list.listIterator(); /*while(lit.hasNext()) { System.out.println(lit.next()); }*/ System.out.println("------------"); while(lit.hasPrevious()) { System.out.println(lit.previous()); } } }12_Vector的特有功能(了解)
A:Vector類概述
B:Vector類特有功能
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()
C:案例演示
Vector的迭代
import java.util.Enumeration; import java.util.Vector; public class List_5_Vector { public static void main(String[] args) { Vector v = new Vector(); //創(chuàng)建集合對象,List的子類 v.addElement("a"); v.addElement("b"); v.addElement("c"); v.addElement("d"); //Vector迭代 Enumeration en = v.elements(); //獲取枚舉 while(en.hasMoreElements()) { //判斷集合中是否有元素 System.out.println(en.nextElement());//獲取集合中的元素 } } }13_數(shù)據(jù)結(jié)構(gòu)之數(shù)組和鏈表
A:數(shù)組
查詢快修改也快(有索引)
增刪慢(排隊模式)
B:鏈表
查詢慢,修改也慢(傳花法)
增刪快(無順序)
14_List的三個子類的特點
A:List的三個子類的特點
ArrayList:
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快,增刪慢。
線程不安全,效率高。
Vector:
底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組,查詢快,增刪慢。
線程安全,效率低。
Vector相對ArrayList查詢慢(線程安全的)
Vector相對LinkedList增刪慢(數(shù)組結(jié)構(gòu))
LinkedList:
底層數(shù)據(jù)結(jié)構(gòu)是鏈表,查詢慢,增刪快。
線程不安全,效率高。
Vector和ArrayList的區(qū)別
Vector是線程安全的,效率低
ArrayList是線程不安全的,效率高
共同點:都是數(shù)組實現(xiàn)的
ArrayList和LinkedList的區(qū)別
ArrayList底層是數(shù)組結(jié)果,查詢和修改快
LinkedList底層是鏈表結(jié)構(gòu)的,增和刪比較快,查詢和修改比較慢
共同點:都是線程不安全的
B:List有三個兒子,我們到底使用誰呢?
查詢多用ArrayList
增刪多用LinkedList
如果都多ArrayList
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/77175.html
摘要:下一代服務(wù)端開發(fā)下一代服務(wù)端開發(fā)第部門快速開始第章快速開始環(huán)境準備,,快速上手實現(xiàn)一個第章企業(yè)級服務(wù)開發(fā)從到語言的缺點發(fā)展歷程的缺點為什么是產(chǎn)生的背景解決了哪些問題為什么是的發(fā)展歷程容器的配置地獄是什么從到下一代企業(yè)級服務(wù)開發(fā)在移動開發(fā)領(lǐng)域 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開發(fā) 》 Kotlin + Spring Boot : 下一代 Java...
摘要:我的是忙碌的一年,從年初備戰(zhàn)實習春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實習春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:一個數(shù)據(jù)集中只能創(chuàng)建一個全文索引。圓形,使用表示。的提高會導致的提高導致明顯的性能問題。 mongo數(shù)據(jù)模型 文檔與集合 文檔是mongo的核心概念,本質(zhì)是是一種BSON(Binary JSON)數(shù)據(jù),BSON是一種類JSON的二進制數(shù)據(jù),可以在為JSON基礎(chǔ)上添加了一些新的數(shù)據(jù)類型,包括日期、Int32、Int64,常被作為數(shù)據(jù)存儲和網(wǎng)絡(luò)數(shù)據(jù)交換的格式,缺點是空間利用率并不理想(存在...
摘要:中很多特性或者說知識點都是和面向?qū)ο缶幊谈拍钕嚓P(guān)的。在多線程中內(nèi)容有很多,只是簡單說明一下中初步使用多線程需要掌握的知識點,以后有機會單獨再詳細介紹一些高級特性的使用場景。 寫這篇文章的目的是想總結(jié)一下自己這么多年來使用java的一些心得體會,主要是和一些java基礎(chǔ)知識點相關(guān)的,所以也希望能分享給剛剛?cè)腴T的Java程序員和打算入Java開發(fā)這個行當?shù)臏市率謧儯M梢越o大家一些經(jīng)...
1_(去除ArrayList中重復字符串元素方式)* A:案例演示 需求:ArrayList去除集合中字符串的重復值(字符串的內(nèi)容相同) 思路:創(chuàng)建新集合方式 import java.util.ArrayList; import java.util.Iterator; public class ArrayList_1_demo { /* 創(chuàng)建新集合將重復元素去掉 * 1.明...
閱讀 644·2023-04-25 15:49
閱讀 3099·2021-09-22 15:13
閱讀 1237·2021-09-07 10:13
閱讀 3467·2019-08-29 18:34
閱讀 2556·2019-08-29 15:22
閱讀 499·2019-08-27 10:52
閱讀 677·2019-08-26 18:27
閱讀 3009·2019-08-26 13:44