探究數(shù)組
1:概念
數(shù)組是一個(gè)線性結(jié)構(gòu)并淋,它用一組連續(xù)的內(nèi)存空間地址儲(chǔ)存相同類型的數(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ǔ)存的值磁奖。
>相同類型:數(shù)據(jù)所占內(nèi)存地址大小一樣(字節(jié)大小)钢坦。
2:特性
>隨機(jī)訪問(wèn)
數(shù)組如何隨機(jī)訪問(wèn)數(shù)據(jù)原理:
以一個(gè)長(zhǎng)度為10的int類型數(shù)組為列 int[] i = new int[10];
此時(shí)計(jì)算機(jī)分配的內(nèi)存地址為1000~1039;長(zhǎng)度為10究孕,int類型的數(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開始
首先假設(shè)我們從1開始,則:
a [i]_address = base_address + (i - 1 ) * data_type_size ;
此時(shí)就會(huì)多一步運(yùn)算的操作绘趋。因此就會(huì)提升運(yùn)算的效率。
假設(shè)從0開始,則:
a [i]_address = base_address + i * data_type_size ;
此時(shí)就少了一個(gè)減法步驟得封,提供了計(jì)算效率埋心。
·數(shù)組為什么必須使用相同類型
我們都知道每種數(shù)據(jù)類型,占用內(nèi)存空間有所不同忙上。比如:
Byte:1字節(jié)
Char:2字節(jié)
Int:4字節(jié)
Double:8字節(jié)
假設(shè)數(shù)組支持儲(chǔ)存不同類型數(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ù)∏氨辏《大表哥編程》