2020-06-06


探究數(shù)組

1:概念

數(shù)組是一個(gè)線性結(jié)構(gòu),它用一組連續(xù)的內(nèi)存空間地址儲(chǔ)存相同類(lèi)型的數(shù)據(jù)。

>連續(xù)的內(nèi)存地址:計(jì)算機(jī)在分配內(nèi)存空間的時(shí)候都會(huì)對(duì)應(yīng)分配一個(gè)內(nèi)存地址,連續(xù)的內(nèi)存的空間就是連續(xù)的內(nèi)存地址,計(jì)算機(jī)通過(guò)訪問(wèn)內(nèi)存地址訪問(wèn)內(nèi)存地址中儲(chǔ)存的值。

>相同類(lèi)型:數(shù)據(jù)所占內(nèi)存地址大小一樣(字節(jié)大小)。

2:特性

>隨機(jī)訪問(wèn)

數(shù)組如何隨機(jī)訪問(wèn)數(shù)據(jù)原理:

以一個(gè)長(zhǎng)度為10的int類(lèi)型數(shù)組為列 int[] i = new int[10];

此時(shí)計(jì)算機(jī)分配的內(nèi)存地址為1000~1039;長(zhǎng)度為10,int類(lèi)型的數(shù)據(jù)占4個(gè)字節(jié),所以內(nèi)存地址大小為40。內(nèi)存塊的首地址base_address = 1000;

如圖(圖片來(lái)源于網(wǎng)上):

首先我們來(lái)看看這樣的一個(gè)公式:

a [i]_address = base_address + i * data_type_size ;

>base_address:內(nèi)存塊的首地址

>i:下標(biāo)(元素的偏移量)

>data_type_size:數(shù)據(jù)的字節(jié)大小

每一個(gè)元素占用4個(gè)字節(jié)內(nèi)存空間(本列中是int)

a[0]_address = 1000 = 1000 + 0 * 4 ;

a[1]_address = 1004 = 1000 + 1 * 4 ;

a[2]_address = 1008 = 1000 + 2 * 4 ;

.....................

a[i]_address = 1000 + i * data_type_size ;

這就是數(shù)組下標(biāo)隨機(jī)訪問(wèn)的原理,通過(guò)下標(biāo)計(jì)算出對(duì)應(yīng)的內(nèi)存空間地址,找到對(duì)應(yīng)的值,時(shí)間復(fù)雜度o(1)。

3:數(shù)組下標(biāo)為什么從0開(kāi)始

首先假設(shè)我們從1開(kāi)始,則:

a [i]_address = base_address + (i - 1 ) * data_type_size ;

此時(shí)就會(huì)多一步運(yùn)算的操作。因此就會(huì)提升運(yùn)算的效率。

假設(shè)從0開(kāi)始,則:

a [i]_address = base_address + i * data_type_size ;

此時(shí)就少了一個(gè)減法步驟,提供了計(jì)算效率。

·數(shù)組為什么必須使用相同類(lèi)型

我們都知道每種數(shù)據(jù)類(lèi)型,占用內(nèi)存空間有所不同。比如:

Byte:1字節(jié)

Char:2字節(jié)

Int:4字節(jié)

Double:8字節(jié)

假設(shè)數(shù)組支持儲(chǔ)存不同類(lèi)型數(shù)據(jù),就無(wú)法根據(jù)下標(biāo)(偏移量)來(lái)實(shí)現(xiàn)隨機(jī)訪問(wèn)

a [i]_address = base_address + i * data_type_size ;

4:數(shù)組為什么不能擴(kuò)容

假設(shè)數(shù)組支持?jǐn)U容:

new int[10], jvm會(huì)分配40個(gè)字節(jié)內(nèi)存空間,此時(shí)jvm給另外的對(duì)象分配了內(nèi)存空間1040 ~ xxxx; 現(xiàn)在數(shù)組進(jìn)行擴(kuò)容時(shí),發(fā)現(xiàn)數(shù)組后面的內(nèi)存空間被人使用了,無(wú)法擴(kuò)容。無(wú)法擴(kuò)容的原因是數(shù)組的內(nèi)存空間分配必須是連續(xù)的內(nèi)存。

如果一旦不連續(xù)的擴(kuò)容,就會(huì)導(dǎo)致隨機(jī)訪問(wèn)特性失效。有人說(shuō)可以預(yù)留,但是你想想你根本不知道你數(shù)組擴(kuò)容多大,這個(gè)時(shí)候你預(yù)留多少的連續(xù)內(nèi)存空間了????

因此這也是為什么要求數(shù)組的內(nèi)存空間分配必須是連續(xù)的,在創(chuàng)建數(shù)組的時(shí)候就指定大小。

歡迎大家關(guān)注我的公眾號(hào)。一起探討技術(shù)?!洞蟊砀缇幊獭?/p>


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容