目錄
什么是遍歷?
一、Collection集合的遍歷方式
1.迭代器遍歷
方法
流程
案例
2. foreach(增強for循環(huán))遍歷
案例
3.Lamdba表達式遍歷
案例
二、數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)介紹
常見數(shù)據(jù)結(jié)構(gòu)
棧(Stack)
隊列(Queue)
鏈表(Link)
散列表(Hash Table)
樹(Tree)
List接口
ArraysList集合
LinkedList集合?
Set接口?
HaseSet集合
LinkedHaseSet集合
TreeSet集合
工具類
Collecations集合工具類
補充
可變參數(shù)
什么是遍歷?
????????遍歷就是一個一個的把容器中的元素訪問一遍
一、Collection集合的遍歷方式
Collection集合的遍歷方式有三種:
- 迭代器
- foreach(增強for循環(huán))
- JDK 1.8開始之后的新技術(shù) Lambda表達式
1.迭代器遍歷
方法
public Iterator iterator(): 獲取集合對應的迭代器,用來遍歷集合中的元素
E next():獲取下一個元素值!
boolean hasNext():判斷是否有下一個元素,有返回true ;反之,則返回false
流程
1.先獲取當前集合的迭代器,迭代器需要寫泛型,指定類型
? ? ? ? ? ? ? Iterator<E> it = lists.iterator();
2.定義一個while循環(huán),問一次取一次
???通過it.hasNext()詢問是否有下一個元素,有就通過
? ? ? ? ? ? ? it.next()取出下一個元素?
????????出現(xiàn)異常NoSuchElementException,出現(xiàn)沒有此元素異常!
案例
public class CollectionDemo01 { public static void main(String[] args) { Collection<String> lists = new ArrayList<>(); lists.add("張三"); lists.add("李四"); lists.add("王五"); lists.add("趙六"); System.out.println(lists); // lists = [張三, 李四, 王五, 趙六] // 1.得到集合的迭代器對象。 Iterator<String> it = lists.iterator(); // 2.使用while循環(huán)遍歷。 while(it.hasNext()){ String ele = it.next(); System.out.println(ele); } } }
[張三, 李四, 王五, 趙六] 張三 李四 王五 趙六
2. foreach(增強for循環(huán))遍歷
????????foreach可以遍歷集合或者數(shù)組
缺點:foreach遍歷無法知道遍歷到了哪個元素了,因為沒有索引
案例
public class CollectionDemo02 { public static void main(String[] args) { Collection<String> lists = new ArrayList<>(); lists.add("張三"); lists.add("李四"); lists.add("王五"); lists.add("趙六"); System.out.println(lists); // lists = [張三, 李四, 王五, 趙六] // ele for (String ele : lists) { System.out.println(ele); } } }
[張三, 李四, 王五, 趙六] 張三 李四 王五 趙六
3.Lamdba表達式遍歷
????????JDK 1.8開始之后的新技術(shù)Lambda表達式,調(diào)用foeEach
案例
public class CollectionDemo03 { public static void main(String[] args) { Collection<String> lists = new ArrayList<>(); lists.add("張三"); lists.add("李四"); lists.add("王五"); lists.add("趙六"); System.out.println(lists); // lists = [張三, 李四, 王五, 趙六] // ele lists.forEach(s -> { System.out.println(s); }); // lists.forEach(s -> System.out.println(s)); // // lists.forEach(System.out::println); } }
二、數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)結(jié)構(gòu)介紹
數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)是以什么方式組合在一起的
數(shù)據(jù)結(jié)構(gòu)不僅要存儲元素,還要提供對元素進行增刪改查的操作
常見數(shù)據(jù)結(jié)構(gòu)
常見的數(shù)據(jù)結(jié)構(gòu):棧、隊列、鏈表、散列表、樹
棧(Stack)
????????棧(stack)是限制插入和刪除只能在一個位置上進行的表,該位置是表的末端,叫做棧頂 (top)。它是后進先出(LIFO)的。對棧的基本操作只有 push(進棧)和 pop(出棧)兩種,前者相當于插入,后者相當于刪除最后的元素
隊列(Queue)
????????隊列是一種特殊的線性表 ,特殊之處在于它只允許在表的前端(front)進行刪除操作,而在表的后端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭
鏈表(Link)
1
散列表(Hash Table)
???????? 散列表算法希望能盡量做到不經(jīng)過任何比較,通過一次存取就能得到所查找的數(shù)據(jù)元素構(gòu)造散列函數(shù)的方法有:????????直接定址法: 取關鍵字或關鍵字的某個線性函數(shù)值為散列地址。
????????????????即:h(key) = key 或 h(key) = a * key + b,其中 a 和 b 為常數(shù)。
????????數(shù)字分析法
????????平方取值法: 取關鍵字平方后的中間幾位為散列地址。
????????折疊法:將關鍵字分割成位數(shù)相同的幾部分,然后取這幾部分的疊加和作為散列地址。
????????
????????除留余數(shù)法:取關鍵字被某個不大于散列表表長 m 的數(shù) p 除后所得的余數(shù)為散列地址, 即:h(key) = key MOD p p ≤ m
????????隨機數(shù)法:選擇一個隨機函數(shù),取關鍵字的隨機函數(shù)值為它的散列地址,
即:h(key) = random(key)
樹(Tree)
樹具有的特點:
每一個節(jié)點有零個或者多個子節(jié)點
沒有父節(jié)點的節(jié)點稱之為根節(jié)點,一個樹最多有一個根節(jié)點。
每一個非根節(jié)點有且只有一個父節(jié)點
名詞 | 含義 |
---|---|
節(jié)點 | 指樹中的一個元素 |
節(jié)點的度 | 節(jié)點擁有的子樹的個數(shù),二叉樹的度不大于2 |
葉子節(jié)點 | 度為0的節(jié)點,也稱之為終端結(jié)點 |
高度 | 葉子結(jié)點的高度為1,葉子結(jié)點的父節(jié)點高度為2,以此類推,根節(jié)點的高度最高 |
層 | 根節(jié)點在第一層,以此類推 |
父節(jié)點 | 若一個節(jié)點含有子節(jié)點,則這個節(jié)點稱之為其子節(jié)點的父節(jié)點 |
子節(jié)點 | 子節(jié)點是父節(jié)點的下一層節(jié)點 |
兄弟節(jié)點 | 擁有共同父節(jié)點的節(jié)點互稱為兄弟節(jié)點 |
樹基本結(jié)構(gòu)介紹
樹的進階
注意事項:
? ? ? ? 除了java.util.PriorityQueue沒有實現(xiàn)Cloneable接口外,Java合集框架中的其他類所有類都實現(xiàn)了java.util.Cloneable和java.util.Serializable接口
? ? ? ? 所以,除了優(yōu)先隊列,其他合集都可以克隆和實例化
樹
左邊高,向右旋
如果右旋,無法滿足條件的話,放棄右旋,用左旋
List接口
????????List系列集合:添加的元素,是有序,可重復,有索引的
LinkedList: 添加的元素,是有序,可重復,有索引的
ArrayList: 添加的元素,是有序,可重復,有索引的
Vector 是線程安全的,速度慢,工作中很少使用
List接口中常用方法
public void add(int index, E element)
: 將指定的元素,添加到該集合中的指定位置上。
public E get(int index)
:返回集合中指定位置的元素。
public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element)
:用指定元素替換集合中指定位置的元素,返回值的更新前的元素
ArraysList集合
????????ArrayList實現(xiàn)類集合底層基于數(shù)組存儲數(shù)據(jù)的,查詢快,增刪慢
public void add(int index, E element): 將指定的元素,添加到該集合中的指定位置上
public E get(int index):返回集合中指定位置的元素
public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素
public E set(int index, E element):用指定元素替換集合中指定位置的元素,返回更新前的元素值
底層
特點:元素增刪慢,查找快
LinkedList集合?
????????LinkedList是支持雙鏈表,定位前后的元素是非??斓?,增刪首尾的元素也是最快的。
提供了很多操作首尾元素的特殊API可以做棧和隊列的實現(xiàn)是一個雙向鏈表
底層
特點:
方法:
public void addFirst(E e)
:將指定元素插入此列表的開頭。
public void addLast(E e)
:將指定元素添加到此列表的結(jié)尾。
public E getFirst()
:返回此列表的第一個元素。
public E getLast()
:返回此列表的最后一個元素。
public E removeFirst()
:移除并返回此列表的第一個元素。
public E removeLast()
:移除并返回此列表的最后一個元素。
public E pop()
:從此列表所表示的堆棧處彈出一個元素。
public void push(E e)
:將元素推入此列表所表示的堆棧。
public boolean isEmpty()
:如果列表不包含元素,則返回true
Set接口?
介紹
? ? ? ? Set是一個用于存儲和處理無重復元素的高效數(shù)據(jù)結(jié)構(gòu)
特點
? ? ? ? 沒有重復元素,沒有提過索引遍歷
可以使用HaseSet、LinkedHashSet、TreeSet類
研究兩個問題(面試熱點):
1)Set集合添加的元素是不重復的,是如何去重復的?
2)Set集合元素無序的原因是什么?
HaseSet集合
HashSet:添加的元素,是無序,不重復,無索引的
底層
LinkedHaseSet集合
????????LinkedHashSet底層依然是使用哈希表存儲元素的,但是每個元素都額外帶一個鏈來維護添加順序
????????增刪查快,而且有序。????????缺點:多了一個存儲順序的鏈會占內(nèi)存空間,而且不允許重復,無索引。
TreeSet集合
????????TreeSet: 不重復,無索引,按照大小默認升序排序
????????TreeSet集合自自排序的方式:
- 有值特性的元素直接可以升序排序。(浮點型,整型)
- 字符串類型的元素會按照首字符的編號排序。
- 對于自定義的引用數(shù)據(jù)類型,TreeSet默認無法排序,執(zhí)行的時候直接報錯,因為說明排序規(guī)則。
????????自定義的引用數(shù)據(jù)類型的排序?qū)崿F(xiàn):
對于自定義的引用數(shù)據(jù)類型,TreeSet默認無法排序
所以我們需要定制排序的大小規(guī)則,程序員定義大小規(guī)則的方案有2種:
第1種:直接為對象的類實現(xiàn)比較器規(guī)則接口Comparable,重寫比較方法(拓展方式)
????????如果程序員認為比較者大于被比較者 返回正數(shù)
????????如果程序員認為比較者小于被比較者 返回負數(shù)
????????如果程序員認為比較者等于被比較者 返回0
第2種:直接為集合設置比較器Comparator對象,重寫比較方法
????????如果程序員認為比較者大于被比較者 返回正數(shù)
????????如果程序員認為比較者小于被比較者 返回負數(shù)
????????如果程序員認為比較者等于被比較者 返回0
注意:如果類和集合都帶有比較規(guī)則,優(yōu)先使用集合自帶的比較規(guī)則
Map接口
????????Map集合是一種雙列集合,每個元素包含兩個值。
????????Map集合的每個元素的格式:key=value(鍵值對元素)。
????????Map集合也被稱為“鍵值對集合”Map集合的完整格式:{key1=value1 , key2=value2 , key3=value3 , ...}
特點:
- Map集合的特點都是由鍵決定的
- Map集合的鍵是無序,不重復的,無索引的。Map集合后面重復的鍵對應的元素會覆蓋前面的整個元素
- Map集合的值無要求
- Map集合的鍵值對都可以為null
注意:
- Map集合的鍵和值都可以存儲自定義類型。
- 如果希望Map集合認為自定義類型的鍵對象重復了,必須重寫對象的hashCode()和equals()方法
實現(xiàn)類:
????????HashMap:元素按照鍵是無序,不重復,無索引,值不做要求。
????????LinkedHashMap:元素按照鍵是有序,不重復,無索引,值不做要求。????????TreeMap:按照鍵是可排序不重復的鍵值對集合
HashMap集合
LinkedHashMap集合
TreeMap集合
工具類
Collecations集合工具類
????????java.utils.Collections:是集合工具類
????????Collections并不屬于集合,是用來操作集合的工具類。
Collections有幾個常用的API:
? ? ? ? ?public static <T> boolean addAll(Collection<? super T> c, T... elements)
? ? ? ? ? ? ?給集合對象批量添加元素!
? ? ? ? ?public static void shuffle(List<?> list) :打亂集合順序。
? ? ? ? ?public static <T> void sort(List<T> list):將集合中元素按照默認規(guī)則排序。
? ? ? ? ?public static <T> void sort(List<T> list,Comparator<? super T> ):將集合中元素按照指定規(guī)則排序。
補充
可變參數(shù)
????????可變參數(shù)用在形參中可以接收多個數(shù)據(jù)
????????可變參數(shù)的格式:數(shù)據(jù)類型... 參數(shù)名稱????????可變參數(shù)的作用文章來源:http://www.zghlxwxcb.cn/news/detail-633669.html
- 傳輸參數(shù)非常靈活,方便
- 可以不傳輸參數(shù)
- 可以傳輸一個參數(shù)
- 可以傳輸多個參數(shù)
- 可以傳輸一個數(shù)組
????????可變參數(shù)在方法內(nèi)部本質(zhì)上就是一個數(shù)組
????????可變參數(shù)的注意事項:文章來源地址http://www.zghlxwxcb.cn/news/detail-633669.html
- 一個形參列表中可變參數(shù)只能有一個
- 可變參數(shù)必須放在形參列表的最后面
public class MethodDemo { public static void main(String[] args) { sum(); // 可以不傳輸參數(shù)。 sum(10); // 可以傳輸一個參數(shù)。 sum(10,20,30); // 可以傳輸多個參數(shù)。 sum(new int[]{10,30,50,70,90}); // 可以傳輸一個數(shù)組。 } public static void sum(int...nums){ // 可變參數(shù)在方法內(nèi)部本質(zhì)上就是一個數(shù)組。 System.out.println("元素個數(shù):"+nums.length); System.out.println("元素內(nèi)容:"+ Arrays.toString(nums)); System.out.println("--------------------------"); } }
到了這里,關于Java02-迭代器,數(shù)據(jù)結(jié)構(gòu),List,Set ,Map,Collections工具類的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!