Collection集合的遍歷方法
1. 迭代器
- 先獲取集合的迭代器對(duì)象
- 方法:Iterator<E> iterator() 得到當(dāng)前集合的迭代器對(duì)象
- 代碼:Iterator<String> it = names.iterator();
- 使用whils循環(huán)通過對(duì)it.hasNext()詢問是否有下一個(gè)元素
- 有就返回true然后進(jìn)入循環(huán)通過it.Next()取出下一個(gè)元素
- 沒有就返回false,結(jié)束循環(huán)
- 注意: 迭代器不能通過Next()去訪問超過了最大個(gè)數(shù)的元素!!!
2. foreach
for(被遍歷集合或者數(shù)組中元素的類型 變量名稱 : 被遍歷集合或者數(shù)組){
}
? 小結(jié): foreach遍歷原理就是迭代器,寫法是簡化寫法
3. JDK1.8之后新增技術(shù)
- 集合對(duì)象.forEach(System.out::println);
Java數(shù)據(jù)結(jié)構(gòu)
1. 什么是數(shù)據(jù)結(jié)構(gòu)
- 數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)以什么方法組織在一起
- 不同的數(shù)據(jù)結(jié)構(gòu),增刪改查的性能是不一樣的
- 不同的集合底層會(huì)采用不同的數(shù)據(jù)結(jié)構(gòu),我們要知道集合的底層是基于哪種數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)和操作數(shù)據(jù)的.
2. 常見數(shù)據(jù)結(jié)構(gòu)
- 隊(duì)列(queue)
先進(jìn)先出,后進(jìn)后出
場景:各種排隊(duì),叫號(hào)系統(tǒng) - 棧(stack)
后進(jìn)先出,先進(jìn)后出
壓棧 == 入棧
彈棧 == 出棧
場景:彈夾的裝彈射擊步驟 - 線性表(數(shù)組)
線性表是內(nèi)存中的連續(xù)存儲(chǔ)區(qū)域
分成若干等分的小區(qū)域(每個(gè)區(qū)域大小是一樣的)
元素存在索引
特點(diǎn): 查詢?cè)乜?根據(jù)索引快速計(jì)算出元素的地址,然后立即去定位)
增刪元素慢(創(chuàng)建新數(shù)組,遷移元素) - 鏈表
元素不是內(nèi)存中的連續(xù)區(qū)域存儲(chǔ)
元素是游離存儲(chǔ)的,每個(gè)元素會(huì)記錄下一個(gè)元素的地址
特點(diǎn): 查詢?cè)芈?br> 增刪元素快 - 紅黑樹
二叉樹: binary tree 永遠(yuǎn)只有一個(gè)根節(jié)點(diǎn),是每個(gè)結(jié)點(diǎn)不超過2個(gè)節(jié)點(diǎn)的樹(tree)
排序二叉樹:小的左邊,大的右邊,但是可能樹很高,性能變差.為了做排序和搜索!
紅黑樹(就是自平衡的排序二叉樹):樹盡量的保證到了很矮小,但是又排好序了,性能最高的樹.增刪改查性能都好!
List系列集合的使用
1. ArrayList
public void add(int index, E element): 將指定的元素,添加到該集合中的指定位置上。
public E get(int index):返回集合中指定位置的元素。
public E remove(int index): 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element):用指定元素替換集合中指定位置的元素,返回值的更新前的元素。
2. LinkedList
底層是基于鏈表的,增刪比較快,查詢慢??!
-
所以LinkedList多了很多操作首尾元素的特殊功能
public void addFirst(E e):將指定元素插入此列表的開頭。 public void addLast(E e):將指定元素添加到此列表的結(jié)尾。 public E getFirst():返回此列表的第一個(gè)元素。 public E getLast():返回此列表的最后一個(gè)元素。 public E removeFirst():移除并返回此列表的第一個(gè)元素。 public E removeLast():移除并返回此列表的最后一個(gè)元素。 public E pop():從此列表所表示的堆棧處彈出一個(gè)元素。 public void push(E e):將元素推入此列表所表示的堆棧。
Set系列集合的使用
1. HashSet
- 添加的元素,是無序,不重復(fù),無索引的。
2. LinkedHashSet
- 添加的元素,是有序,不重復(fù),無索引的。
3. Set系列集合元素去重復(fù)的流程
對(duì)于基本數(shù)據(jù)類型的值,Set集合可以直接判斷進(jìn)行去重復(fù)。
-
對(duì)于引用數(shù)據(jù)類型的值,Set集合是按照如下流程進(jìn)行是否重復(fù)的判斷。
Set集合會(huì)讓兩兩對(duì)象,先調(diào)用自己的hashCode()方法得到彼此的哈希值(所謂的內(nèi)存地址)
然后比較兩個(gè)對(duì)象的哈希值是否相同,如果不相同直接認(rèn)為兩個(gè)對(duì)象不重復(fù)。
如果相同,會(huì)繼續(xù)讓兩個(gè)對(duì)象進(jìn)行equals比較內(nèi)容是否相同,如果相同認(rèn)為真的重復(fù)了
如果不相同認(rèn)為不重復(fù)。
調(diào)用hashCode()方法獲取兩個(gè)對(duì)象的哈希值 / \ false true / \ 不重復(fù) 兩個(gè)對(duì)象進(jìn)行equals比較 / \ false true / \ 不重復(fù) 重復(fù)了
4. Set系列集合元素?zé)o序的根本原因
- Set系列集合添加元素?zé)o序的根本原因是因?yàn)榈讓硬捎昧斯1泶鎯?chǔ)元素。
小結(jié)
- Set集合的增刪改查性能都挺好的!
- 缺點(diǎn)是:無序不重復(fù)的,無索引的。
- 對(duì)于引用數(shù)據(jù)類型,如果希望Set集合識(shí)別是同一個(gè)對(duì)象。
- 可以重寫對(duì)象的hashCode和equals方法