1. java數組在內存中是如何存放的
數組是一種引用數據類型,數組引用變數只是一個引用,數組元素和數組變數在內存里是分開存放的.
實際的數組元素被存儲在堆(heap)內存中;數組引用變數是一個引用類型的變數,被存儲在棧(stack)內存中.
2. 關於JAVA數組的幾點注意事項與一些低級錯誤
關於JAVA數組的幾點注意事項與一些低級錯誤
1、數組不是集合,它只能保存同種類型的多個原始類型或者對象的引用。數組保存的僅僅是對象的引用,而不是對象本身。
2、數組本身就是對象,Java中對象是在堆中的,因此數組無論保存原始類型還是其他對象類型,數組對象本身是在堆中的。
3、數組聲明的兩種形式:一、int[] arr; 二、int arr[]; 推薦使用前者,這符合Sun的命名規范,而且容易了解到關鍵點,這是一個int數組對象,而不是一個int原始類型。
數組初始化可以在聲明是進行,int[] arr = {1,2,3}或者int[] arr = new int[3]{1,2,3}。
4、在數組聲明中包含數組長度永遠是不合法的!如:int[5] arr; 。因為,聲明的時候並沒有實例化任何對象,只有在實例化數組對象時,JVM才分配空間,這時才與長度有關。
5、在數組構造的時候必須指定長度,因為JVM要知道需要在堆上分配多少空間。反例:int[] arr = new int[];
6、多維數組的聲明。int[][][] arr; 是三維int型數組。
7、一維數組的構造。形如:String[] sa = new String[5];
或者分成兩句:String[] sa; sa = new String[5];
8、原始類型數組元素的默認值。對於原始類型數組,在用new構造完成而沒有初始化時,JVM自動對其進行初始化。默認值:byte、short、 int、long--0 float--0.0f double--0.0 boolean--false char--'"u0000'。(無論該數組是成員變數還是局部變數)
9、對象類型數組中的引用被默認初始化為null。如:Car[] myCar = new Car[10]; 相當於從myCar[0]到myCar[9]都這樣被自動初始化為myCar[i] = null;
10、對象類型的數組雖然被默認初始化了,但是並沒有調用其構造函數。也就是說:Car[] myCar = new Car[10];只創建了一個myCar數組對象!並沒有創建Car對象的任何實例!
11、多維數組的構造。float[][] ratings = new float[9][]; 第一維的長度必須給出,其餘的可以不寫,因為JVM只需要知道賦給變數ratings的對象的長度。
12、數組索引的范圍。數組中各個元素的索引是從0開始的,到length-1。每個數組對象都有一個length屬性,它保存了該數組對象的長度。(注意和String對象的length()方法區分開來,這兩者沒有統一起來是很遺憾的。)
13、Java有數組下標檢查,當訪問超出索引范圍時,將產生運行時異常。注意,這種下標檢查不是在編譯時刻進行的,而是在運行時!也就是說int[] arr = new int[10]; arr[100] = 100; 這么明顯的錯誤可以通過編譯,但在運行時拋出!
Java的數組下標檢查是需要額外開銷的,但是出於安全的權衡還是值得的,因為很多語言在使用數組時是不安全的,可以任意訪問自身內存塊外的數組,編譯運行都不會報錯,產生難以預料的後果!
3. java中的數組存在哪
數組在堆內存。引用是在棧。
因為數組是一個引用類型。所以傳遞進去的是它們的引用,故在方法中互換了它們的值,也必然影響到它們原來的值.
4. Java數組是存儲在內存中的什麼地方
因為我也不清楚你理解的內存指啥,說我的理解,猜測一下,但願符合你的理解:
對程序而言,內存分為:
a、靜態區塊或叫全局區塊,指程序載入的時候就分配的固定存儲區;
b、棧內存,代碼塊執行的時候動態分配的內存塊,代碼運行完後,操作系統或運行平台負責自動回收這部分使用的內存。
c、堆內存塊,由操作系統提供api程序自由分配管理的內存塊。
java的內存管理機制,我個人認為是黑盒的,寫java也很少有人去關心,但是如果看虛擬機的實現源碼還是能知道的。(樓主懂c由興趣自己看)。那麼從逆向工程的角度我們可以猜測到:
靜態類,靜態變數,存儲在,靜態區塊中。
類本身代碼需要時再載入到內存中,java的動態代理實現的根本。既然是動態載入肯定是在堆中,不過載入進來的類代碼可能永不會銷毀(虛擬機運行區間內,可以加快運行平台的處理速度,java屬於半編譯半解釋的一門語言,要解釋執行的是預先編譯好的指令,就是class類文件)。
我們創建的任何對象,時間是隨機的,創建的時候才會分配內存,必然在堆上。虛擬機的垃圾回收機制要管理的剛好是這部分內存。
類中的方法,或靜態代碼塊必定運行在占上,代碼運行完,內存立即回收。此處有個例外,不同於c語言或操作系統實現。在方法中返回的任何對象:c需要動態分配存儲空間,兵自行管理,或者申明為全局局部靜態存儲,代碼運行完,對象才能保留下來。java可以直接保留下來。說明虛擬機自動給我們申請了動態內存保存對象。此處分配的內存也需要垃圾回收機制管理。沒門語言都有原始類型,方法或函數中返回的原始類型不需要從堆上分配內存,直接復制給接收變數,或代碼運行的形參所分配的空間中即可。
從操作系統理解,內存分為內核使用的內存與程序使用的內存,java運行在虛擬機上,虛擬機運行在操作系統上,內核內存屬於操作系統自用內存,由操作系統負責管理,運用程序不能直接管理分配內核內存。應用程序可管理的是分配給自己的運行空間。因此java使用內存屬於應用程序內存。內核內存管理方式windows與unix實現管理方式不一樣,最大差別windows的每一個程序,內核需要使用掉一部分地址空間,餘下的留給應用程序。如32位系統,總共可以使用的地址空間是4G內核要用掉其中1G或者2G。但是unix實現的系統應用程序可以直接使用4G地址空間。有興趣請參考操作系統內核相關書籍。
5. [C++,Java,C#] 數組是否類型創建後是在堆上還是在棧上
1、數組是類型,C#、Java中對象類型,也就是類類型。2、C++創建數組是在棧上,C#、Java在棧上存放的是數組的引用,數組的元素在堆上。
6. java數組基本問題
靜態初始化程序員在初始化數組時為數組每個元素賦值動態初始化: 數組初始化時,程序員只指定數組的長度,由系統為每個元素賦初值。
對於這個問題關鍵在於要弄清楚數組變數和數組對象的差別。數組變數是存放在棧內存中的,數組對象是存放在堆內存中的。數組變數只是一個引用變數,他能夠指向實際的數組對象。所謂的數組初始化並非對數組變數初始化,而是對數組對象進行初始化。
7. java在存儲數組時棧內存和堆內存的聯系是什麼
先這樣分開寫,方便解釋
int[] a=null;//聲明數組,也是引用
a=new int[5];//分配內存地址。
好了,數組的引用,也就是a,當你在聲明的時候,他會在棧中開辟一個地址空間。也就是第一步
第二步的作用,是在堆中開辟一系統連續的地址,具體的需要根據你的類型還有數組長度。
總結下,也是,數組的引用保存在棧中,同時實例的時候在堆中開辟連續空間,棧中的空間指向堆的首地址。
再稍微說明一下,為什麼我們平常說不new不可以對數組進行操作呢??因為此時堆中沒有分配內存地址。所以你的數據沒有地方存放和操作。
8. java中聲明數組不用new,為什麼數組依然在堆裡面還有這樣有什麼壞處
你列印的是數組z的內存地址。
數組聲明可以用new,比如 int[] array = new int[10]; 聲明一個有10個元素的數組,這是默認式
要想列印數組的元素,這樣寫
for(int i=0;i<array.length;i++)
{
System.out.println(array[i]);
}
這是動態式
int a[] ;
a = new int[3] ;
a[0] = 0 ;
a[1] = 1 ;
a[2] = 2 ;
這是靜態式
int a[] = {0,1,2} ;
沒什麼區別,看個人需要
9. Java數組在內存中是什麼樣的
數組在內存中是一個連續的內存單元,大小根據類型和長度計算,二維數組,是多個一維數組的索引形成一個一維數組。所以在java中只有一維數組。