集合框架
1.集合的特點
a.只能存儲引用數據類型的數據
b.長度可變
c.集合中有大量的方法,方便我們操作
2.分類:
a.單列集合:一個元素就一個組成部分:
list.add(“張三”)
b.雙列集合:一個元素有兩部分構成: key 和 value
map.put(“濤哥”,“金蓮”) -> key,value叫做鍵值對
Collection接口
單列集合的頂級接口
使用
Collection <泛型> 對象名 = new 實現類集合對象<泛型>();
泛型,決定集合中的元素都是啥類型的,必須指定的是引用數據類型
方法
boolean add(E e)
: 將給定的元素添加到當前集合中(我們一般調add時,不用boolean接收,因為add一定會成功)
boolean addAll(Collection<? extends E> c)
:將另一個集合元素添加到當前集合中 (集合合并)
void clear()
:清除集合中所有的元素
boolean remove(Object o)
:將指定的元素從集合中刪除
boolean contains(Object o)
:判斷當前集合中是否包含指定的元素
boolean isEmpty()
: 判斷當前集合中是否有元素->判斷集合是否為空
int size()
:返回集合中的元素個數。
Object[] toArray()
: 把集合中的元素,存儲到數組中
public class Demo01Collection {public static void main(String[] args) {Collection<String> collection = new ArrayList<>();//boolean add(E e) : 將給定的元素添加到當前集合中(我們一般調add時,不用boolean接收,因為add一定會成功)collection.add("蕭炎");collection.add("蕭薰兒");collection.add("彩鱗");collection.add("小醫仙");collection.add("云韻");collection.add("濤哥");System.out.println(collection);//boolean addAll(Collection<? extends E> c) :將另一個集合元素添加到當前集合中 (集合合并)Collection<String> collection1 = new ArrayList<>();collection1.add("張無忌");collection1.add("小昭");collection1.add("趙敏");collection1.add("周芷若");collection1.addAll(collection);System.out.println(collection1);//void clear():清除集合中所有的元素collection1.clear();System.out.println(collection1);//boolean contains(Object o) :判斷當前集合中是否包含指定的元素boolean result01 = collection.contains("濤哥");System.out.println("result01 = " + result01);//boolean isEmpty() : 判斷當前集合中是否有元素->判斷集合是否為空System.out.println(collection1.isEmpty());//boolean remove(Object o):將指定的元素從集合中刪除collection.remove("濤哥");System.out.println(collection);//int size() :返回集合中的元素個數。System.out.println(collection.size());//Object[] toArray(): 把集合中的元素,存儲到數組中Object[] arr = collection.toArray();System.out.println(Arrays.toString(arr));}
}
迭代器?????
1.概述:Iterator接口
2.獲取:Collection中的方法 Itreator<E> itreator()
3.方法:
boolean hasNext() -> 判斷集合中有沒有下一個元素E next() ->獲取下一個元素
4.注意-并發修改異常
public class Demo03Iterator {public static void main(String[] args) {//需求:定義一個集合,存儲 唐僧,孫悟空,豬八戒,沙僧,遍歷集合,如果遍歷到豬八戒,往集合中添加一個白龍馬ArrayList<String> list = new ArrayList<>();list.add("唐僧");list.add("孫悟空");list.add("豬八戒");list.add("沙僧");Iterator<String> iterator = list.iterator();while(iterator.hasNext()){String element = iterator.next();if ("豬八戒".equals(element)){list.add("白龍馬");}}System.out.println(list);}
}
我們調用add方法,而add方法是底層只給modCount++,但是再次調用next方法的時候,并沒有修改后的modCount重新賦值給expectedModCount,導致next方法底層的判斷出先實際操作與預期操作次數不等的情況,所以拋出了”并發修改異常“。
5.迭代器底層原理
獲取Iterator的時候怎么獲取的:Iterator iterator = list.iterator()
我們知道Iterator是一個接口,等號右邊一定是它的實現類對象
問題:Iterator接收的到底是哪個實現類對象呢? -> ArrayList中的內部類Itr對象
注意:只有ArrayList使用迭代器的時候Iterator接口才會指向Itr,其他的集合使用迭代器Iterator就指向的不是Itr了
List接口?????
ArrayList
1.特點:
a.元素有序,按照什么順序存儲,就按照什么順序取。
b.元素可重復
c.有索引,可以利用索引取操作元素
d.線程不安全
2.數據結構:數組
3.方法:
boolean add(E e)
-> 將元素添加到集合中->尾部(add方法一定能添加成功的,所以我們不用boolean接收返回值)
void add(int index, E element)
->在指定索引位置上添加元素
boolean remove(Object o)
->刪除指定的元素,刪除成功為true,失敗為false
E remove(int index)
-> 刪除指定索引位置上的元素,返回的是被刪除的那個元素
E set(int index, E element)
-> 將指定索引位置上的元素,修改成后面的element元素
E get(int index)
-> 根據索引獲取元素
int size()
-> 獲取集合元素個數
4.原理:
a.不是一new底層就會創建初始容量為10的空列表,而是第一次add的時候才會創建初始化容量為10的空列表
b.ArrayList底層是數組,那么為啥還說集合長度可變呢?
ArrayList底層會自動擴容-> Arrays.copyOf
c.擴容多少倍?
1.5倍
LinkedList
1.特點:
a.元素有序,按照什么順序存儲,就按照什么順序取。
b.元素可重復
c.有索引,本質無索引,但是java中創建了很多根據索引操作元素的方法
d.線程不安全
2.數據結構:雙向鏈表
3.方法
public void addFirst(E e)
:將指定元素插入此列表的開頭。public void addLast(E e)
:將指定元素添加到此列表的結尾。public E getFirst()
:返回此列表的第一個元素。public E getLast()
:返回此列表的最后一個元素。public E removeFirst()
:移除并返回此列表的第一個元素。public E removeLast()
:移除并返回此列表的最后一個元素。public E pop()
:從此列表所表示的堆棧處彈出一個元素。類似于public removeFirst()
public void push(E e)
:將元素推入此列表所表示的堆棧。public boolean isEmpty()
:如果列表沒有元素,則返回true。
增強for?????
1.作用:遍歷集合或者數組
2.格式
for(元素類型 變量名:要遍歷的集合名或者數組名){變量名代表每一個元素;
}
//快捷寫法 要遍歷的集合或數組名.for
3.實現原理
遍歷集合時底層為迭代器
遍歷數組時底層為普通for循環
學習資料來源尚硅谷