java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):緒論
基本概念和術(shù)語
要想知道數(shù)據(jù)結(jié)構(gòu)是什么,我們首先得去知道,數(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ù)
數(shù)據(jù):是描述客觀事物的符號(hào),是計(jì)算機(jī)中可以操作的對(duì)象,是能被計(jì)算機(jī)識(shí)別并輸入給計(jì)算機(jī)處理的符號(hào)集合
這樣說可能還是有人覺得頭痛,說直白點(diǎn),空氣粒子組成了空氣,一個(gè)個(gè)的人組成了一群人,這樣就懂了吧。
以后見了面你就可以跟別人說,你是一個(gè)數(shù)據(jù),看人家會(huì)不會(huì)揍你
但是,你理解可以去這么理解,用的話不能這么去用,我們這兒說的數(shù)據(jù),是一個(gè)抽象性的概念,其實(shí)也就是符號(hào),比如,你的for循環(huán)。所以這些符號(hào)必須滿足兩個(gè)條件:
- 可以輸入到計(jì)算機(jī)中
- 能被計(jì)算機(jī)程序處理
數(shù)據(jù)元素
數(shù)據(jù)元素:是組成數(shù)據(jù)的,有一定意義的基本單位,在計(jì)算機(jī)中通常作為整體處理。也被稱之為記錄
比如,在人類中,人就是數(shù)據(jù)元素,在動(dòng)物中,雞鴨魚這些就是數(shù)據(jù)元素;
數(shù)據(jù)項(xiàng)
數(shù)據(jù)項(xiàng):一個(gè)數(shù)據(jù)元素可以由瑞剛額數(shù)據(jù)項(xiàng)組成;數(shù)據(jù)項(xiàng)是不可分割的最小單位
舉個(gè)例子:組成人這樣的數(shù)據(jù)元素就是由耳朵,鼻子,眼睛這樣的數(shù)據(jù)項(xiàng)組成
我們?cè)谡嬲懻搯栴}的時(shí)候,主要還是數(shù)據(jù)元素,而不是去討論數(shù)據(jù)項(xiàng)。你看個(gè)電影不可能一直去研究別人演員撒。
數(shù)據(jù)對(duì)象
數(shù)據(jù)對(duì)象:是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的子集
人都有生日吧,都有年齡吧,都有姓名吧,這就是他們的性質(zhì)。
為什么又說是性質(zhì)相同的數(shù)據(jù)元素的集合呢?你在定義一個(gè)類的時(shí)候,你會(huì)去根據(jù)某一個(gè)人去定義嗎?不會(huì)吧,你肯定是根據(jù)總體的特征去定義,比如:
class Person(){ private String name; private String addr; private int age; }
你肯定是這樣去定義,而不是:
class Zhangsan(){ private int money; private int age; }
懂了吧。
結(jié)構(gòu)
簡單理解就是關(guān)系。比如分子結(jié)構(gòu),就是說組成分子的原子之間的排列方式。
在現(xiàn)實(shí)世界中,所有的數(shù)據(jù)元素都不是獨(dú)立的,二十有特定的關(guān)系連接在一起的,我們就將這些關(guān)系稱之為結(jié)構(gòu)
比如你和你的親戚,一方有難,八方支援的道理總得知道。
數(shù)據(jù)結(jié)構(gòu)
是相互之間存在一種或多種特地給關(guān)系的數(shù)據(jù)元素的集合
這下你看完了前面的,就知道了數(shù)據(jù)結(jié)構(gòu)是啥了吧。
所以,要想編寫出一個(gè)好的程序,必須分待處理對(duì)象的特性以及個(gè)處理對(duì)象之間存在的關(guān)系。這也就是我們?yōu)槭裁匆獙W(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的意義。
我們提到了很多次的關(guān)系,到底是什么樣的關(guān)系,我們往下看看?
邏輯結(jié)構(gòu)與物理結(jié)構(gòu)
按照我們看待的方式不同,分為邏輯結(jié)構(gòu)和物理結(jié)構(gòu)
邏輯結(jié)構(gòu)
邏輯結(jié)構(gòu):是指數(shù)據(jù)對(duì)象中數(shù)據(jù)元素之間的相互關(guān)系
這其實(shí)也是我們最需要關(guān)注的東西;邏輯結(jié)構(gòu)又分以下四種:
集合結(jié)構(gòu)
集合結(jié)構(gòu)中的數(shù)據(jù)元素除了同屬于一個(gè)集合外,他們之間沒有任何關(guān)系。各個(gè)數(shù)據(jù)元素是平等的,他們的共同屬性就是同屬于一個(gè)集合。
就比如說,你和你的大學(xué)同學(xué)都處于同一個(gè)教室,但是你和他們并不是很熟
在數(shù)據(jù)結(jié)構(gòu)中,集合就很類似于數(shù)學(xué)當(dāng)中的集合,長這樣:
線性結(jié)構(gòu)
這個(gè)很好理解,就是一對(duì)一的關(guān)系,就類似于排成一條線。長這樣兒:
樹形結(jié)構(gòu)
數(shù)據(jù)元素就像一棵樹一樣擺放,就注定了,數(shù)據(jù)元素是一對(duì)多的形式
圖形結(jié)構(gòu)
元素與元素之間用線連接,如果是指向某元素,就用方向箭頭連接。同處于一個(gè)集合內(nèi),擺放順序是雜亂無章的
所以我們也不難看出,邏輯結(jié)構(gòu)是針對(duì)具體問題,為了解決問題。所以,在這個(gè)基礎(chǔ)上,我們必須選擇一個(gè)合適的數(shù)據(jù)結(jié)構(gòu)。
物理結(jié)構(gòu)
我們上面聊完了邏輯結(jié)構(gòu),也清楚了大致的屬性是什么。我們?cè)賮砜纯戳硪粋€(gè)-------物理結(jié)構(gòu)
物理結(jié)構(gòu)好像在其他的書里面也叫做是存儲(chǔ)結(jié)構(gòu),但是都差不多,意思都是相近的。
物理結(jié)構(gòu):是指數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)中的存儲(chǔ)形式
我們前面知道,數(shù)據(jù)是數(shù)據(jù)元素的集合,那么根據(jù)物理結(jié)構(gòu)的定義,實(shí)際上就是怎么把數(shù)據(jù)元素存儲(chǔ)在計(jì)算機(jī)的存儲(chǔ)器中存儲(chǔ)器主要是針對(duì)內(nèi)存而言的,比如說硬盤,光盤之類的。
數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)應(yīng)正確的反應(yīng)出數(shù)據(jù)元素之間的邏輯關(guān)系,這才是最關(guān)鍵的。具體怎么去存儲(chǔ)數(shù)據(jù)元素之間的邏輯關(guān)系才是物理結(jié)構(gòu)的重難點(diǎn)。
數(shù)據(jù)元素存儲(chǔ)形式有兩種:順序存儲(chǔ)和鏈?zhǔn)酱鎯?chǔ)
順序存儲(chǔ)
把數(shù)據(jù)元素存放在地址連續(xù)的存儲(chǔ)單元里,其數(shù)據(jù)的邏輯關(guān)系和物理關(guān)系是一致的。
就好比說,你去食堂吃飯,挨個(gè)排隊(duì),誰也別插隊(duì)。
在我們當(dāng)初學(xué)計(jì)算機(jī)的時(shí)候,當(dāng)你想創(chuàng)建一個(gè)數(shù)組,那么計(jì)算機(jī)就會(huì)根據(jù)你指定的長度開辟出一個(gè)空間,挨個(gè)存儲(chǔ)
鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
如果世間萬物都是這樣的有順序那么就好了。但是呢,怎么可能;
在實(shí)際上,總是會(huì)有人插隊(duì),也總是會(huì)有人不排了,突然就走了。如果我們還是用順序存儲(chǔ),無疑是浪費(fèi)空間的。所以我們就選擇了鏈?zhǔn)酱鎯?chǔ)。
鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):把數(shù)據(jù)元素存放在任意的存儲(chǔ)單元里,可以是連續(xù)的,也可以是不連續(xù)的
這樣的話,數(shù)據(jù)的存儲(chǔ)關(guān)系并不能反映出邏輯關(guān)系,因?yàn)槎际请s亂無章的。所以,我們就需要一個(gè)索引去指向他,就類似于指針的作用。每個(gè)元素都會(huì)有自己的地址:
邏輯結(jié)構(gòu)是面向數(shù)據(jù)的,物理結(jié)構(gòu)是面向計(jì)算機(jī)的。所以他的基本目標(biāo)就是將數(shù)據(jù)存儲(chǔ)在計(jì)算機(jī)中。
抽象數(shù)據(jù)類型
我們?cè)诳闯橄髷?shù)據(jù)類型的時(shí)候,先來看看數(shù)據(jù)類型是什么:
數(shù)據(jù)類型:是指一組性質(zhì)相同的值的集合及定義在此集合上的一些操作的總稱
在Java中,有int string boolean等
當(dāng)初設(shè)計(jì)計(jì)算機(jī)語言的人為什么要設(shè)計(jì)數(shù)據(jù)類型呢?
比如說,大家都需要買房子。自然而然,有人想買大房子,有人想買小房子,還有的人買不起房子(比如我)
于是呢,就出來了各式各樣的房子,比如別墅,小戶型等等。
同樣的道理,計(jì)算機(jī)也不是無窮大的,比如你只想計(jì)算1+1這樣的簡單加減法,就不需要那么大的內(nèi)存空間。所以啊,計(jì)算機(jī)的研究者們就考慮,細(xì)分出具體的數(shù)據(jù)類型出來。
再者,因?yàn)橛?jì)算機(jī)有不同的操作系統(tǒng),我們不可能為每一種計(jì)算機(jī)都編寫一套計(jì)算機(jī)語言。我們就可以把這些共同的屬性給抽取出來,作為一種抽象體。
抽象是指抽取出事物具有的普遍性的性質(zhì)
抽象是一種思維,而不是一種具體的形式。
抽象數(shù)據(jù)類型:是指一個(gè)數(shù)學(xué)模型及定義在該模型上的一組操作。
抽象的數(shù)據(jù)仍然是定義的邏輯關(guān)系,而與事物的本身無關(guān)。
事實(shí)上,抽象數(shù)據(jù)類型體現(xiàn)了程序設(shè)計(jì)中問題分解,抽象和信息隱藏的特性。
抽象數(shù)據(jù)類型把實(shí)際生活中的問題分解為多個(gè)規(guī)模小且容易處理的問題,然后建立一個(gè)計(jì)算機(jī)能處理的數(shù)據(jù)模型。并把每個(gè)功能模塊的實(shí)現(xiàn)細(xì)節(jié)作為一個(gè)獨(dú)立的單元,從而使具體實(shí)現(xiàn)過程隱藏起來。
比如Java中,你會(huì)先去定義一個(gè)模型層,用來泛指某一類模型。
總結(jié)
所以,數(shù)據(jù)結(jié)構(gòu)就是相互存在一種或者多種特定關(guān)系的數(shù)據(jù)元素的集合。。同樣是結(jié)構(gòu),卻有不同的表現(xiàn)形式。
邏輯結(jié)構(gòu)
- 集合結(jié)構(gòu)
- 線性結(jié)構(gòu)
- 樹形結(jié)構(gòu)
- 圖形結(jié)構(gòu)
物理結(jié)構(gòu)
- 順序存儲(chǔ)結(jié)構(gòu)
- 鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)
本篇文章就到這里了,希望能給你帶來幫助,也希望能夠您能夠關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
RocketMQ?producer容錯(cuò)機(jī)制源碼解析
這篇文章主要為大家介紹了RocketMQ?producer容錯(cuò)機(jī)制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03分布式醫(yī)療掛號(hào)系統(tǒng)SpringCache與Redis為數(shù)據(jù)字典添加緩存
這篇文章主要為大家介紹了分布式醫(yī)療掛號(hào)系統(tǒng)SpringCache與Redis為數(shù)據(jù)字典添加緩存,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04SpringCloud升級(jí)2020.0.x版之OpenFeign簡介與使用實(shí)現(xiàn)思路
在微服務(wù)系統(tǒng)中,我們經(jīng)常會(huì)進(jìn)行 RPC 調(diào)用。在 Spring Cloud 體系中,RPC 調(diào)用一般就是 HTTP 協(xié)議的調(diào)用。對(duì)于每次調(diào)用,都要經(jīng)過一系列詳細(xì)步驟,接下來通過本文給大家介紹SpringCloud OpenFeign簡介與使用,感興趣的朋友一起看看吧2021-10-10SpringBoot項(xiàng)目中的多數(shù)據(jù)源支持的方法
本篇文章主要介紹了SpringBoot項(xiàng)目中的多數(shù)據(jù)源支持的方法,主要介紹在SpringBoot項(xiàng)目中利用SpringDataJpa技術(shù)如何支持多個(gè)數(shù)據(jù)庫的數(shù)據(jù)源,有興趣的可以了解一下2017-10-10MyBatis入門之增刪改查+數(shù)據(jù)庫字段和實(shí)體字段不一致問題處理方法
這篇文章主要介紹了MyBatis入門之增刪改查+數(shù)據(jù)庫字段和實(shí)體字段不一致問題處理方法,需要的朋友可以參考下2017-05-05Java異常處理中同時(shí)有finally和return語句的執(zhí)行問題
這篇文章主要介紹了Java異常處理中同時(shí)有finally和return語句的執(zhí)行問題,首先確定的是一般finally語句都會(huì)被執(zhí)行...然后,需要的朋友可以參考下2015-11-11如何使用Mockito調(diào)用靜態(tài)方法和void方法
這篇文章主要介紹了如何使用Mockito調(diào)用靜態(tài)方法和void方法的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07Java 中函數(shù) Function 的使用和定義示例小結(jié)
這篇文章主要介紹了Java 中函數(shù) Function 的使用和定義小結(jié),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-07-07