数据结构特性解析 (一) 数组
前言
數(shù)組是java中最基本的數(shù)據(jù)結(jié)構(gòu),有很多更高級的數(shù)據(jù)接口實現(xiàn)方式都是使用的數(shù)組,所以了解數(shù)組是很重要的
描述
數(shù)組是一個對象,內(nèi)部有一塊連續(xù)的內(nèi)存,自身只占用很小的內(nèi)存,其他位置都是根據(jù)長度和類型而分配的值對象或者引用值對象
特點
1. 數(shù)組長度在初始化時確定且無法修改
由上圖可見,數(shù)組并沒有add或修改長度的方法
2.數(shù)組每個位置所占的內(nèi)存大小是在初始化時固定的
數(shù)組中存儲對象都是存儲的其引用值,在同一個環(huán)境下(32位一般4個字節(jié),64位4到8個字節(jié))引用值的大小都是一樣的,因此對象數(shù)組每個位置所占的內(nèi)存大小也是一樣的
而由于64位地址比32位地址更大,所以在64位環(huán)境下,對象數(shù)組也會比32位環(huán)境下占用的空間更大
如果存儲的是基本類型的話,則每個位置所占用的大小都是該基本數(shù)據(jù)類型的大小
ps:基本數(shù)據(jù)占用內(nèi)存大小:https://blog.csdn.net/ccw0054/article/details/79082679
3.數(shù)組是一個創(chuàng)建在堆內(nèi)存中的對象,并且內(nèi)存占用是連續(xù)的
由于數(shù)組的前兩個特性,因此被設(shè)計為內(nèi)存連續(xù)的,這樣查找速度更快(因為每個位置大小固定,并且位置連續(xù),所以只需要通過向陣列頭部的地址添加合適的偏移來找到需要的內(nèi)存地址)
但是這樣的設(shè)計也會使新建大數(shù)組時尋找不到合適的內(nèi)存空間(有可能空間足夠,但不是連續(xù)的)而引發(fā)內(nèi)存重排序(gc?)?? 有待考究
圖示(由于堆的特性和對象自動回收,很有可能會出現(xiàn)下面圖示的情況):
如上圖,想創(chuàng)建一個長度為5的數(shù)組,可是堆內(nèi)存中并沒有一塊連續(xù)的長度夠的內(nèi)存,因此可能會引發(fā)內(nèi)存重排序(gc?)?,然后使內(nèi)存整齊,并騰出足夠的連續(xù)的空間,可以創(chuàng)建出對應(yīng)的數(shù)組,因此數(shù)組也是一個對內(nèi)存要求嚴格的數(shù)據(jù)結(jié)構(gòu)
4.數(shù)組隨機查找比較快
因為特性3,數(shù)組根據(jù)索引的方式去查找數(shù)據(jù),會比較快,不用進行循環(huán)或多次尋址
而遍歷查詢則需要遍歷索引來循環(huán)從數(shù)組中取出
5.數(shù)組支持嵌套
比如:? int[][] ints =new int[10][10];//一個10*10的二維數(shù)組
取用第一層數(shù)組的第5個里的第1個:? int i =?ints[4][0];
ps:也支持多層嵌套,叫做n維數(shù)組,因為平時用不到,所以就不寫了
下一篇:?數(shù)據(jù)結(jié)構(gòu)特性解析 (二) ArrayList
如有錯誤或補充,請各位大佬指出,我會盡快修改
總結(jié)
以上是生活随笔為你收集整理的数据结构特性解析 (一) 数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓UI图分离器(支持ios@2x3x图
- 下一篇: 安卓修改动画效果--动画差值器TimeI