1. 數(shù)據(jù)結(jié)構(gòu)概述
Java的集合框架其實就是對數(shù)據(jù)結(jié)構(gòu)的封裝,在學(xué)習(xí)集合框架之前,有必要先了解下數(shù)據(jù)結(jié)構(gòu)。
1.1. 什么是數(shù)據(jù)結(jié)構(gòu)(了解)
所謂數(shù)據(jù)結(jié)構(gòu),其實就是計算機(jī)存儲、組織數(shù)據(jù)的方式。
數(shù)據(jù)結(jié)構(gòu)是用來模擬數(shù)據(jù)存儲操作的,其實就是對數(shù)據(jù)做增刪改查操作。
增:把某個數(shù)據(jù)存儲到某個容器中
刪:從容器中把某個數(shù)據(jù)刪除掉
改:把容器中某個數(shù)據(jù)替換成另一個數(shù)據(jù)
查:把容器中的數(shù)據(jù)查詢出來
不同的數(shù)據(jù)結(jié)構(gòu),底層采用不同的存儲方式(算法),在具體操作的時候效率是不一樣的,比如有的查詢速度很快,有的插入速度很快,有的操作頭和尾速度很快等。
常見的數(shù)據(jù)結(jié)構(gòu):
數(shù)組(Array)掌握
鏈表(linked List)了解
哈希表(Hash)了解
棧(Stack)了解
隊列(Queue)了解
樹(Tree)了解
圖(Graph)
堆(Heap)
1.2. 數(shù)組結(jié)構(gòu)
1.2.1. 模擬ArrayList(掌握)
假設(shè)我現(xiàn)在是某個籃球隊的教練,需要安排5個球員上場打球。此時需要模擬上場球員的存儲,簡單一點,我們就只存儲上場球員的球衣號碼。那么此時我需要以下幾個操作:
1.初始一個容量為5的容器,用來存儲場上的5個球衣號碼。
2.安排5個球員上場,比如球員號碼分別為11、22、33、44、55。
3.查詢指定索引位置球員的球衣號碼是多少,如查詢索引位置為2的球衣號碼是33。
4.替換場上索引位置為2的球員,使用333號替換33號。
5.罰下場上索引位置為2的球員(直接罰下,沒有補(bǔ)位)。
6.打印出場上球員的球衣號碼,打印風(fēng)格如 [11,22,33,44,55]。
操作前后效果圖:
1.2.2. 初始化操作(掌握)
使用Integer數(shù)組來存儲場上球員號碼,提供了兩個構(gòu)造器,一個用于自定義初始化容量,一個用于使用默認(rèn)的初始化容量10。
測試代碼:
1.2.3. 打印操作(掌握)
1.2.4. 保存操作(掌握)
測試代碼
輸出結(jié)果:
[]
[11,22,33,44,55]
因為數(shù)組的長度是固定的,此時的players數(shù)組只能存儲5個元素,如果再多存儲一個就報錯:數(shù)組索引越界。此時就要考慮在保存操作時對數(shù)組做擴(kuò)容操作,擴(kuò)容的原理是:
創(chuàng)建一個原數(shù)組長度兩倍長的新數(shù)組
把舊數(shù)組中的所有元素拷貝到新數(shù)組中
把新數(shù)組的引用賦給舊數(shù)組變量
保存操作時擴(kuò)容操作:
//向場上添加一個球員號碼
1.2.5. 查詢操作(掌握)
需求:查詢指定索引位置球員的球衣號碼是多少,如查詢索引位置為2的球衣號碼是33。
其實就是返回數(shù)組中,指定索引對應(yīng)的元素值。
測試代碼:
Integer playerNum = list.get(2);
System.out.println(playerNum);
輸出結(jié)果:
33
1.2.6. 修改操作(掌握)
需求:替換場上索引位置為2的球員,使用333號替換33號。
1.2.7. 刪除操作(掌握)
需求:罰下場上索引位置為2的球員(直接罰下,沒有補(bǔ)位)。
刪除操作的原理,把后續(xù)的元素整體往前挪動一個位置。
1.2.8. 讓容器支持存儲任意數(shù)據(jù)類型的元素(掌握)
此時元素類型是Integer類型,也就是只能存儲整型的數(shù)據(jù),但是卻不能存儲其他類型的數(shù)據(jù),此時我們可以考慮吧元素類型改成Object,那么Object數(shù)組可以存儲任意類型的數(shù)據(jù)。
1,首先是定義成員變量和構(gòu)造器:
2,添加和查詢方法:
3,替換和刪除方法:
4,打印方法:
1.2.9. 數(shù)組的性能分析(了解)
在計算機(jī)科學(xué)中,算法的時間復(fù)雜度是一個函數(shù),它定性描述了該算法的運行時間,常用大O符號來表述。
時間復(fù)雜度是同一問題可用不同算法解決,而一個算法的質(zhì)量優(yōu)劣將影響到算法乃至程序的效率。算法分析的目的在于選擇合適算法和改進(jìn)算法。
我們在這里針對ArrayList存儲數(shù)據(jù)的增刪改查(CRUD)做性能分析:
保存操作:
如果保存在數(shù)組的最后一個位置,至少需要操作一次。
如果保存在數(shù)組的第一個位置,如果存在N個元素,此時需要操作N次(后面的元素要整體后移)。
平均: (N+1) /2 次。 N表示數(shù)組中元素的個數(shù)。 如果要擴(kuò)容,更慢,性能更低。
刪除操作:
如果刪除最后一個元素,操作一次。
如果刪除第一個元素,操作N次。
平均:(N+1)/2次.
修改操作: 操作1次.
查詢操作:根據(jù)索引查詢元素: 操作1次.
結(jié)論:基于數(shù)組的數(shù)據(jù)結(jié)構(gòu)做查詢是和修改是非??斓模霰4婧蛣h除操作比較慢了。
那如果想保證保存和刪除操作的性能,此時就得提提鏈表這種數(shù)據(jù)結(jié)構(gòu)了。
以上就是天津卓眾教育java培訓(xùn)機(jī)構(gòu)的小編針對“Java基礎(chǔ)學(xué)習(xí):java數(shù)據(jù)結(jié)構(gòu)視頻”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
Java零基礎(chǔ)學(xué)習(xí)視頻
2020Java零基礎(chǔ)教程:http://www.bjpowernode.com/javavideo/110.html
2020JavaSE進(jìn)階:http://www.bjpowernode.com/javavideo/144.html