對象數組的內存圖解:
集合框架面試題??
?
集合的繼承體系圖解:
什么是集合框架?
?
* 數組和集合的區別?
* A:長度區別
* 數組的長度固定
* 集合長度可變
* B:內容不同
* 數組存儲的是同一種類型的元素
* 而集合可以存儲不同類型的元素
* C:元素的數據類型問題
* 數組可以存儲基本數據類型,也可以存儲引用數據類型
* 集合只能存儲引用類型
*
* 剛說過集合是存儲多個元的,但是呢,存儲多個元素我們也是有不同需求的:比如說,我要這多個元素中不能有相同的元素,
* 再比如說,我要這多個元素按照某種規則排序一下。針對不同的需求,Java就提供了不同的集合類,這樣呢,Java就提供了很多個集合類。
* 這多個集合類的數據結構不同,結構不同不重要的,重要的是你要能夠存儲東西,并且還要能夠使用這些東西,比如說判斷,獲取等。
* 既然這樣,那么,這多個集合類是有共性的內容的,我們把這些集合類的共性內容不斷的向上提取,最終就能形成集合的繼承體系結構。
*
* 數據結構:數據的存儲方式。
*
* Collection:是集合的頂層接口,它的子體系有重復的,有唯一的,有有序的,有無序的。(后面會慢慢的講解)
*
* Collection的功能概述:
* 1:添加功能
* boolean add(Object obj):添加一個元素
* boolean addAll(Collection c):添加一個集合的元素
* 2:刪除功能
* void clear():移除所有元素
* boolean remove(Object o):移除一個元素
* boolean removeAll(Collection c):移除一個集合的元素(是一個還是所有)。只要有一個元素被移除了,就返回true。
* 3:判斷功能
* boolean contains(Object o):判斷集合中是否包含指定的元素
* boolean containsAll(Collection c):判斷集合中是否包含指定的集合元素(是一個還是所有)。只有包含所有的元素,才叫包含
* boolean isEmpty():判斷集合是否為空
* 4:獲取功能
* Iterator<E> iterator()(重點)
* 5:長度功能
* int size():元素的個數
* 面試題:數組有沒有length()方法呢?字符串有沒有length()方法呢?集合有沒有length()方法呢?
集合框架技術、
* 6:交集功能
* boolean retainAll(Collection c):兩個集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢??
//假設有兩個集合A,B。
//A對B做交集,最終的結果保存在A中,B不變。
//返回值表示的是A是否發生過改變。
java中collection和collections的區別。
* 7:把集合轉成數組,可以實現集合的遍歷
* Object[] toArray()
1 // 遍歷 2 // Object[] toArray():把集合轉成數組,可以實現集合的遍歷 3 Object[] objs = c.toArray(); 4 for (int x = 0; x < objs.length; x++) { 5 // System.out.println(objs[x]); 6 // 我知道元素是字符串,我在獲取到元素的的同時,還想知道元素的長度。 7 // System.out.println(objs[x] + "---" + objs[x].length()); 8 // 上面的實現不了,原因是Object中沒有length()方法 9 // 我們要想使用字符串的方法,就必須把元素還原成字符串 10 // 向下轉型 11 String s = (String) objs[x]; 12 System.out.println(s + "---" + s.length());
?
* Iterator iterator():迭代器,集合的專用遍歷方式
* Object next():獲取元素,并移動到下一個位置。
* NoSuchElementException:沒有這樣的元素,因為你已經找到最后了。
* boolean hasNext():如果仍有元素可以迭代,則返回 true。
java集合框架的組成、?
1 // 創建集合對象 2 Collection c = new ArrayList(); 3 4 // 創建并添加元素 5 c.add("hello"); 6 c.add("world"); 7 c.add("java"); 8 9 // Iterator iterator():迭代器,集合的專用遍歷方式 10 Iterator it = c.iterator(); // 實際返回的肯定是子類對象,這里是多態 11 12 // 最終版代碼 13 while (it.hasNext()) { 14 // System.out.println(it.next()); 15 String s = (String) it.next(); 16 System.out.println(s); 17 }
?
1 // for循環改寫 2 for(Iterator it = c.iterator();it.hasNext();){ 3 Student s = (Student) it.next(); 4 System.out.println(s.getName() + "---" + s.getAge());
?
// NoSuchElementException 不要多次使用it.next()方法
// System.out.println(((Student) it.next()).getName() + "---"
// + ((Student) it.next()).getAge());
?
迭代器使用圖解和原理解析:
?
* List集合的特點:
* 有序(存儲和取出的元素一致),可重復的。
?
* List集合的特有功能:
* 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):根據索引修改元素,返回被修飾的元素
?
* 列表迭代器:
* ListIterator listIterator():List集合特有的迭代器
* 該迭代器繼承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
*
* 特有功能:
* Object previous():獲取上一個元素
* boolean hasPrevious():判斷是否有元素
*
* 注意:ListIterator可以實現逆向遍歷,但是必須先正向遍歷,才能逆向遍歷,所以一般無意義,不使用。
1 // 創建List集合對象 2 List list = new ArrayList(); 3 list.add("hello"); 4 list.add("world"); 5 list.add("java"); 6 7 // ListIterator listIterator() 8 ListIterator lit = list.listIterator(); // 子類對象 9 10 while (lit.hasNext()) { 11 String s = (String) lit.next(); 12 System.out.println(s); 13 } 14 15 while (lit.hasPrevious()) { 16 String s = (String) lit.previous(); 17 System.out.println(s); 18 }
?
?
* 問題?
* 我有一個集合,如下,請問,我想判斷里面有沒有"world"這個元素,如果有,我就添加一個"javaee"元素,請寫代碼實現。
*
* ConcurrentModificationException:當方法檢測到對象的并發修改,但不允許這種修改時,拋出此異常。
* 產生的原因:
* 迭代器是依賴于集合而存在的,在判斷成功后,集合的中新添加了元素,而迭代器卻不知道,所以就報錯了,這個錯叫并發修改異常。
* 其實這個問題描述的是:迭代器遍歷元素的時候,通過集合是不能修改元素的。
* 如何解決呢?
* A:迭代器迭代元素,迭代器修改元素
* 元素是跟在剛才迭代的元素后面的。
* B:集合遍歷元素,集合修改元素(普通for)
* 元素在最后添加的。
// 方式1:迭代器迭代元素,迭代器修改元素
// 而Iterator迭代器卻沒有添加功能,所以我們使用其子接口ListIterator
1 ListIterator lit = list.listIterator(); 2 while (lit.hasNext()) { 3 String s = (String) lit.next(); 4 if ("world".equals(s)) { 5 lit.add("javaee"); 6 } 7 }
?
// 方式2:集合遍歷元素,集合修改元素(普通for)
1 for (int x = 0; x < list.size(); x++) { 2 String s = (String) list.get(x); 3 if ("world".equals(s)) { 4 list.add("javaee"); 5 } 6 }
?
數據結構之棧和隊列:
?
數據結構之數組和鏈表:
?
List:(面試題List的子類特點)
ArrayList:
底層數據結構是數組,查詢快,增刪慢。
線程不安全,效率高。
Vector:
底層數據結構是數組,查詢快,增刪慢。
線程安全,效率低。
LinkedList:
底層數據結構是鏈表,查詢慢,增刪快。
線程不安全,效率高。
List有三個兒子,我們到底使用誰呢?
看需求(情況)。
要安全嗎?
要:Vector(即使要安全,也不用這個了,后面有替代的)
不要:ArrayList或者LinkedList
查詢多:ArrayList
增刪多:LinkedList
如果你什么都不懂,就用ArrayList。