Java基礎之數組類型


對於Java,前面的一些基礎概念不是很想寫,看了看還是從數組開始寫吧(畢竟數組是第一個引用類型,相對復雜一點),我也是學了JAVA不是很久,目前看完了JAVA的基礎視頻,還有JAVA瘋狂講義這本書的大部分跟基礎相關的內容,但是看完之后發現之前學的很多東西都忘記了(太急於求成,動手實踐太少),所以想在學習框架之前二刷一遍,把基礎知識點在重溫一下。順便寫寫博客記錄我的JAVA學習歷程,以及我所理解的知識重點~!

 

淺談數組

  數組是我們在學習JAVA過程中遇到的第一個引用類型,它與我們之前所了解的基本類型(int,flout,String)不同,數組存儲的數據是在堆內存中存儲的,而我們基本類型的數據是在棧內存的存儲的(關於堆,棧后面會詳細說明)。接下來就開始我們的數組之旅~

 

數組的概述

  JAVA中,我們要求數組存儲的必須是同一個數據類型的數據,因此我們的數組不能同時存儲多種數據類型的元素(區別於Javascript)。當我們的數組初始化結束之后,我們數組的長度就被確定下來,數組的長度是固定不變的(與集合的區別:集合的長度是可變的)。數組被清空的時候,它所占的空間依然被保留。

 

數組的定義

  定義: 數據類型[] 數組名 = new 數據類型[元素個數或數組長度];

  對於數組定義的說明:1)數據類型: 數組中存儲元素的數據類型。

            2) [] 表示數組的意思。

            3) 變量名 自定義標識符 。

            4) new 創建容器關鍵字。

            5)數據類型: 數組中存儲元素的數據類型

            6)[] 表示數組的意思。

            7)元素個數,就是數組中,可以存儲多少個數據 (恆定, 定長)

  數組是一個容器: 存儲到數組中的每個元素,都有自己的自動編號。最小的下標值為0,最大下標值(為數組的長度-1)。訪問數組存儲的元素,必須依賴於索引:數組名[索引]。

  數組提供了一個屬性來求得數組的長度:length屬性。因此假設我們的數組名為arr,這個數組的長度就為:arr.length,數組的第一個元素就為arr[0],數組的最后一個元素就為arr[arr.length-1]。

 

JVM的理解

  JVM虛擬機相當於連接着JAVA與操作系統,通俗的理解為,java是在JVM上進行開發的。

  JVM對自己的內存划分為5個區域:(1).寄存器:內存和CUP之間。(2).本地方法棧: JVM調用了系統中的功能。 (3).方法和數據共享: 運行時期class文件進入的地方。(4).方法棧:所有的方法運行的時候進入內存。 (5). 堆:存儲的是容器和對象

              

數組的初始化

  數組的初始化有兩種方式:靜態初始化和動態初始化。

(1).靜態初始化:由程序員顯示指定每個數組元素的初始值,由系統決定數組長度。

 

int[] array = {1,2,3,4,5};

(2).動態初始化:程序員只指定數組長度,由系統為數組元素分配值。

 

int[] array = new int[5];

  系統所分配的值有幾下幾種:1).byte,short,int,long類型,數組被賦值成0.

               2).float,double類型,數組被賦值成0.0.

                 3).char類型,數組被賦值成“\u0000”.

               4).boolean類型,數組被賦值成false.

               5).引用類型(類,接口,數組),數組被賦值成null.

 

增強的for循環---foreach循環

  在Java5之后,Java提供了一種新的循環:foreach循環。foreach循環會自動遍歷數組和集合的每個元素。

foreach的語法格式如下:

for(type arrName : array||collection){

    //自動迭代訪問的每個元素
}    

 

type:數組元素或者集合元素的類型。arrName:一個形參名。array:要遍歷的數組名。collection:要遍歷的集合名。

下面舉一個例子來使用foreach方法:

public class fun {
public static void main(String[] args) {
    String[] array = {"ABC","abc","sdf","gvc","sf"};
    for(String arr : array){
        System.out.println(arr);
    }
}
}
//最終的結果是:
ABC
abc
sdf
gvc
sf

 

但是值得注意的是:使用foreach循環的時候,不能在循環中對數組元素進行賦值,否則得出的結果是不正確的,這里面不詳細說明。

 

深入了解數組

  上面我們了解了數組的一些基本的功能以及使用方法,但是數組在內存中的運行機制是什么呢?之前提到的基本類型以及引用類型的存儲在哪里呢?堆存儲和棧存儲的區別是什么呢?接下來我一一講述。

我們首先要明確的一個概念就是:數組是一個引用的數據類型,數組的引用變量只是一個引用,數組元素和數組變量在內存中是分開的。

數組變量其實是一個引用(相當於C語言里面的指針),我們通過這個數組變量指向有效的內存來訪問元素。因此我們如果要訪問數組里面的變量,我們只能使用數組的引用變量來訪問它的元素。

接下來是一個數組的內存圖,通過這個圖來理解內存中的數組:

                

 

  首先我們要了解的就是,在JVM中,棧和堆都是存儲的容器。每一個方法在執行的時候,該方法都會建立一個自己的內存棧,在這個方法內定義的變量將會逐個的放在這塊棧里。隨着這個方法的結束,這個棧會自動的銷毀,因此,所有方法中的局部變量都是存儲在棧內存中的。當程序中創建一個對象的時候,這個對象將被保存在運行時的數據區中,以便可以反復的利用(因為創建對象的成本大),這個運行時的數據區就是堆內存,堆內存中的對象不會因為方法的結束而被銷毀,因為即使這個方法結束后,該對象也可能被另一個引用變量引用,只有當一個對象沒有任何引用變量引用它的時候,它才會被系統的垃圾回收器在合適的時候銷毀。有時候我們會讓系統回收一個數組所占的空間,那么我們只需要將數組變量賦值為null,這就切斷了數組引用變量和實際數組之間的關系,數組就被回收了。

  如上所示,我們將數組的引用放在棧內存中(arr),將數組的對象放在堆內存中(new int[3]),我們數組的引用實際上是一個指向它的對象的指針,當我們想在數組中取第一個元素的時候,我們只需要將這個指針指向第一個元素,我們便可以獲得第一個元素的值:arr[0]。

 

二維數組

所謂二維數組,通俗的來說就是將一維數組存儲到了一維數組中.。我們將二維數組的定義為:

type[][] arrName = new type[][];
或者
type[][] arrName = [[1,2,3],[2,3,4],[3,4,5]];

 

其中第一個代表行數,第二個代表列數。

二維數組的內存圖如下所示(與一維數組差不多,就是在一維數組中存儲了一維數組而已):

                  

我們可以把二維數組理解成一維數組。向3維,4維......n維數組,暫且可以不用看,一般二維就已經夠了,了解了內存的存儲方式,其實也挺好理解的。

 

 

為了我們共同進步,我這里有計算機專業的各種視頻,

 

如果想要,關注我的公眾號:念流聲。私聊我,看到后給你連接(只放了一張圖片,視頻有很多,需要什么可以私聊問我,有的話就給你)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM