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