摘自百科上的一句话
程序设计语言中,数组元素在内存中是一个接着一个线性存放的,通过第一个元素就能访问随后的元素,这样的数组称之为"真数组"。
实现了真数组为Java语言健壮性的特点之一。
问题有两个:
1."真数组"的概念是否如上所说,那么对应的"伪数组"如何表达?
2."真数组"是Java语言健壮性的特点体现在哪?
黄舟2017-04-17 17:10:25
提供一篇部落格解釋js中的偽數組
js的偽數組
我的理解:
ADT(abstract data type)資料抽象類型:一個資料模型及定義在該模型上的一組運算。
數組是一種抽象的資料類型,Java中數組是對象,它所包含的資料在記憶體中是連續排列的,並且你可以對數組進行一系列的操作。
關於邊界檢查
來自維基百科
邊界檢查在程式設計中是指在使用某一個變數前,用來檢查該變數是否處在一個特定範圍之內的過程。最常見的是數組的下標檢查,來防止下標超出數組的範圍而覆蓋其他的資料。
若是邊界檢查未能發現錯誤,最常見的結果是程式出現異常並終止運行,但也可能出現其他的現象。
由於每次都進行邊界檢查非常耗時,而且有些程式碼是不可能產生越界的問題的,所以這個操作並不總是需要被執行。在一些現代的編譯器中有被稱為選擇性邊界檢查的技術可以略去一些常見的不需要的邊界檢查來提高程式的效能
所以C/C++中不檢查數組越界應該是為了提高效率。
Java中存在對數組下標的檢查,如果數組越界將會拋出異ArrayIndexOutOfBoundsException,數組越界會對記憶體中其他的資料產生覆蓋,造成程式崩潰,這樣提高了程式的健全性。
寫的有點亂,有錯誤指出希望大家指出來,謝謝大家的回答。
總覺得還是有問題!
2016年2月17日12:28:45 修改
數組定義(維基百科)
數組概念有雙重意義,一是資料類型,二是實體(entity)。
C/C++標準中的數組
C語言標準中規定,一個數組類型描述了連續分配的非空的具有特定元素對象類型的對象集合。 >這些元素物件的類型稱為元素類型(element type)。數組類型由元素類型與元素的數目決定。
Java中的陣列與C/C++並無區別,至於ArrayList底層也是透過陣列實現的。
數組特性(維基百科)
數組設計之初是在形式上依賴記憶體分配而成的,所以必須在使用前預先請求空間。這使得數組有>以下特性:
請求空間以後大小固定,不能再改變(數據溢出問題);
在內存中有空間連續性的表現,中間不會存在其他程序需要調用的數據,為此數組的專用內存空>間;
在舊式程式語言中(如有中階語言之稱的C),程式不會對數組的操作做下界判斷,也就有潛在>的越界操作的風險(例如會把資料寫在運行中程式需要呼叫的核心部分的記憶體上)。
根據以上總結:
真數組:
在記憶體中連續分配。
數組所存在的記憶體空間為數組專用,避免了資料被覆蓋的問題。
數組內存放的類型是確定的,唯一的。
int[] array = {1,2}//int型数组
偽數組具體看首行的博客,這裡把裡面的一個例子貼出來
var arr = {
'0' : '000',
'1' : '111',
'2' : '222',
'length' : 3,
'name' : 'an object looks like array',
'type' : 'object'
}
天蓬老师2017-04-17 17:10:25
個人理解:Java中的數組中的資料是連續儲存在一塊記憶體中的,所以可以透過下標(即偏移量)的方式存取;假數組,例如Python裡面的list,存取方式同Java的數組一樣,但是他在記憶體中並非連續。
至於體現健壯性,自己悟吧,我也不知道什麼是健壯性
大家讲道理2017-04-17 17:10:25
第一次聽到真數組,不過聽過為偽數組,就像是前面同學說的,JavaScript的數組就是典型的偽數組。不過要說真數組的話,你看的那個百科裡的解釋應該也算對。
但是說到數組,還有一個多維數組,它在不同的語言裡實現也不一樣,比如在C++裡面,多維數組在內存裡是連續的,但是在java裡,多維數組的每一維在記憶體裡很可能不是連續的。所以這個了解了就好,沒有必要細究。
關於健壯性,沒啥感覺。 。 。