基於Java 數組內存分派的相干成績。本站提示廣大學習愛好者:(基於Java 數組內存分派的相干成績)文章只能為提供參考,不一定能成為您想要的結果。以下是基於Java 數組內存分派的相干成績正文
能夠Java 數組年夜家都很熟習,比來我碰到了一個關於Java 數組內存分派的成績。
呵呵。忽然就發明很多書上“根本數據類型存儲在棧內存傍邊,對象則保留在堆內存”這句話完整是毛病的。上面是個簡略的例子代碼:
public class Test {
public static void main(String[] argv) {
// 靜態初始化數組
String[] names = { "Michael", "Orson", "Andrew" };
// 靜態初始化數組
String[] animal = new String[4];
// 讓animal 指向 namens 數組所援用的數組
names = animal;
System.out.println(names.length);
System.out.println(animal.length);
}
}
“Java 數組年夜小是不克不及轉變的”這能夠年夜家都聽過,那下面這段代碼就有成績了,animal [] 長度為4,而names [] 數組的長度只要3,然則經由一個賦值語句,兩個數組的年夜小就都變成4了。這不是轉變了數組的年夜小嗎? 成績就如許擋在眼前了!好吧,問問技巧先輩吧,就如許對數組的存儲方法有了全新的熟悉。上面是我的一點懂得:(假如有毛病的,恰好被年夜神你看到了,也請你可以或許指出來。)
下面的的 names 和 animal 不代表這個數組對象,而僅僅是數組的變量罷了,和C外面的指針是一樣的,如許的變量叫做援用變量。數組對象是保留在堆內存傍邊,年夜小固然是不克不及轉變的,然則數組變量卻可以或許指向其他的數組對象,可以看看上面這個圖:
藍虛線是賦值語句 names = animal; 之前 names 和 animal 數組變量指向的堆內存傍邊數組對象; 紅線是是賦值語句 names = animal;以後 names 和 animal 數組變量都同時指向一個數組對象。固然這時候候 Java 渣滓收受接管機制這時候候就會發明誰人沒人援用的數組對象然後把它帶走。 從下面還可以看到,“Michael”,"Orson","Andrew" 這些都是根本的數據類型吧。然則他們卻存儲在堆內存傍邊。 現實上應當如許說:部分變量放在棧內存傍邊,(像下面的 names[],animal[] 這類援用類型的變量,還有一些根本類型的變量),但運用變量所援用的對象是保留是堆內存傍邊的。(包含數組還有一些我們平凡寫的通俗的類對象)Java在堆內存傍邊的對象平日是不許可直接拜訪的,但你可以想到直接拜訪的效果。為了拜訪堆內存傍邊的對象,這時候候就須要援用變量這個中介。甚麼時刻Java存儲在棧內存中的變量是僅僅是援用變量? 甚麼時刻它又換了身份變成名副其實的JAVA對象納?嗯,看看上面這個例子:
public class Animal {
private String name;
private int age;Animal(String name, int age) {
this.name = name;
this.age = age;
}public void info() {
System.out.println(name + " " + age);
}
}
public class Test { public static void main(String[] argv) {
// 靜態初始化數組
Animal[] animal = new Animal[2];
Animal cat = new Animal("cat", 1);
Animal dog = new Animal("dog", 2);
animal[0] = dog;
animal[1] = cat;// 當數組變量援用對象的辦法(或許屬性)的時刻,它就變成現實的Java 對象
System.out.println(animal.length);
//dog 這個本來存儲在棧內存傍邊的對象援用經由過程挪用對象的辦法變成現實的對象
dog.info();
animal[0].info();
}
}
只要當棧內存中的援用變量挪用了對象的辦法或許是指向了對象的屬性的時刻,它就從變量真正成了對象了。(好比下面例子中的 cat,dog 對象援用變量,animal[]數組變量)。 經由過程animal[0] = dog;
animal[1] = cat; 使得兩個變量都指向了存儲在堆內存傍邊的對象,所以他們倆個打印出來的信息是如出一轍的.
上圖中藍線是賦值語句: animal[0] = dog;
animal[1] = cat; 之前的變量指向的狀況,紅虛線是賦值語句以後的狀況,animal[0]和dog ,animal[1] 和cat 所指向的都是雷同的堆內存空間。