java中的資料結構——陣列
在Java中,陣列非常常用,大部分的資料結構也是基於陣列來實現的。
與陣列有關的話題:
1.在java中,宣告一個數組過程中,是如何分配記憶體的?
A. 當宣告陣列型別變數時,為其分配了(32位)引用空間,由於未賦值,因此並不指向任何物件;
B.當建立了一個數組物件(也就是new出來的)並將其地址賦值給了變數,其中創建出來的那幾個陣列元素相當於引用型別變數,因此各自佔用(32位的)引用空間並按其預設初始化規則被賦值為null
C. 程式繼續執行,當建立新的物件並(將其地址)賦值給各陣列元素,此時堆記憶體就會有值了。
2.Java變數一定要初始化嗎?
不一定。Java陣列變數是引用資料型別變數,它並不是陣列物件本身,只要讓陣列變數指向有效的陣列物件,即可使用該陣列變數。對陣列執行初始化,並不是對陣列變數進行初始化,而是對陣列物件進行初始化——也就是為該陣列物件分配一塊連續的記憶體空間,這塊連續的記憶體空間就是陣列的長度。
3.基本型別變數都放在棧記憶體中?
錯。應該這樣說:所有區域性變數都放在棧記憶體裡儲存的,不管其是基本型別的變數,還是引用型別變數,都是儲存在各自的方法棧區中;但是引用型別變數所引用的物件(包括陣列、普通java物件)則總是儲存在堆記憶體中。
4.引用變數何時只是棧記憶體中的變數本身,何時又變為引用例項的java物件?
引用變數本質上只是一個指標,只要程式通過引用變數訪問屬性,或者通過引用變數來呼叫方法,該引用變數將會由他所引用的物件代替。
5.陣列(Array)和列表(ArrayList)有什麼區別?什麼時候應該使用Array而不是ArrayList?
下面列出了Array和ArrayList的不同點:
Array可以包含基本型別和物件型別,ArrayList只能包含物件型別。
Array大小是固定的,ArrayList的大小是動態變化的。
ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。
對於基本型別資料,集合使用自動裝箱來減少編碼工作量。但是,當處理固定大小的基本資料型別的時候,這種方式相對比較慢。