麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > Java > 正文

基于Java 數(shù)組內(nèi)存分配的相關(guān)問(wèn)題

2019-11-26 16:05:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

可能Java 數(shù)組大家都很熟悉,最近我遇到了一個(gè)關(guān)于Java 數(shù)組內(nèi)存分配的問(wèn)題。
呵呵。突然就發(fā)現(xiàn)許多書上“基本數(shù)據(jù)類型存儲(chǔ)在棧內(nèi)存當(dāng)中,對(duì)象則保存在堆內(nèi)存”這句話完全是錯(cuò)誤的。下面是個(gè)簡(jiǎn)單的例子代碼:

復(fù)制代碼 代碼如下:

public class Test {
    public static void main(String[] argv) {
// 靜態(tài)初始化數(shù)組
String[] names = { "Michael", "Orson", "Andrew" };
// 動(dòng)態(tài)初始化數(shù)組
String[] animal = new String[4];
// 讓animal 指向 namens 數(shù)組所引用的數(shù)組
names = animal;

System.out.println(names.length);
System.out.println(animal.length);
    }
}


“Java 數(shù)組大小是不能改變的”這可能大家都聽過(guò),那上面這段代碼就有問(wèn)題了,animal [] 長(zhǎng)度為4,而names [] 數(shù)組的長(zhǎng)度只有3,但是經(jīng)過(guò)一個(gè)賦值語(yǔ)句,兩個(gè)數(shù)組的大小就都變?yōu)?了。這不是改變了數(shù)組的大小嗎? 問(wèn)題就這樣擋在面前了!好吧,問(wèn)問(wèn)技術(shù)前輩吧,就這樣對(duì)數(shù)組的存儲(chǔ)方式有了全新的認(rèn)識(shí)。下面是我的一點(diǎn)理解:(如果有錯(cuò)誤的,剛好被大神你看到了,也請(qǐng)你能夠指出來(lái)。)
上面的的 names 和 animal 不代表這個(gè)數(shù)組對(duì)象,而僅僅是數(shù)組的變量而已,和C里面的指針是一樣的,這樣的變量叫做引用變量。數(shù)組對(duì)象是保存在堆內(nèi)存當(dāng)中,大小當(dāng)然是不能改變的,但是數(shù)組變量卻能夠指向其他的數(shù)組對(duì)象,可以看看下面這個(gè)圖:

藍(lán)虛線是賦值語(yǔ)句 names = animal; 之前 names 和 animal 數(shù)組變量指向的堆內(nèi)存當(dāng)中數(shù)組對(duì)象; 紅線是是賦值語(yǔ)句 names = animal;之后 names 和 animal 數(shù)組變量都同時(shí)指向一個(gè)數(shù)組對(duì)象。當(dāng)然這時(shí)候 Java 垃圾回收機(jī)制這時(shí)候就會(huì)發(fā)現(xiàn)那個(gè)沒(méi)人引用的數(shù)組對(duì)象然后把它帶走。 從上面還可以看到,“Michael”,"Orson","Andrew" 這些都是基本的數(shù)據(jù)類型吧。但是他們卻存儲(chǔ)在堆內(nèi)存當(dāng)中。  實(shí)際上應(yīng)該這樣說(shuō):局部變量放在棧內(nèi)存當(dāng)中,(像上面的 names[],animal[] 這種引用類型的變量,還有一些基本類型的變量),但應(yīng)用變量所引用的對(duì)象是保存是堆內(nèi)存當(dāng)中的。(包括數(shù)組還有一些我們平常寫的普通的類對(duì)象)Java在堆內(nèi)存當(dāng)中的對(duì)象通常是不允許直接訪問(wèn)的,但你可以想到直接訪問(wèn)的后果。為了訪問(wèn)堆內(nèi)存當(dāng)中的對(duì)象,這時(shí)候就需要引用變量這個(gè)中介。什么時(shí)候Java存儲(chǔ)在棧內(nèi)存中的變量是僅僅是引用變量? 什么時(shí)候它又換了身份變?yōu)樨浾鎯r(jià)實(shí)的JAVA對(duì)象納?嗯,看看下面這個(gè)例子:
復(fù)制代碼 代碼如下:

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) {
// 動(dòng)態(tài)初始化數(shù)組
Animal[] animal = new Animal[2];
Animal cat = new Animal("cat", 1);
Animal dog = new Animal("dog", 2);
animal[0] = dog;
animal[1] = cat;// 當(dāng)數(shù)組變量引用對(duì)象的方法(或者屬性)的時(shí)候,它就變?yōu)閷?shí)際的Java 對(duì)象
System.out.println(animal.length);
//dog 這個(gè)原本存儲(chǔ)在棧內(nèi)存當(dāng)中的對(duì)象引用通過(guò)調(diào)用對(duì)象的方法變?yōu)閷?shí)際的對(duì)象
dog.info();
animal[0].info();
    }
}

只有當(dāng)棧內(nèi)存中的引用變量調(diào)用了對(duì)象的方法或者是指向了對(duì)象的屬性的時(shí)候,它就從變量真正成了對(duì)象了。(比如上面例子中的 cat,dog 對(duì)象引用變量,animal[]數(shù)組變量)。       通過(guò)animal[0] = dog;
animal[1] = cat;       使得兩個(gè)變量都指向了存儲(chǔ)在堆內(nèi)存當(dāng)中的對(duì)象,所以他們倆個(gè)打印出來(lái)的信息是一模一樣的.

上圖中藍(lán)線是賦值語(yǔ)句:        animal[0] = dog;
animal[1] = cat;          之前的變量指向的狀態(tài),紅虛線是賦值語(yǔ)句之后的狀態(tài),animal[0]和dog ,animal[1] 和cat 所指向的都是相同的堆內(nèi)存空間。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 午夜激情视频免费 | 国产papa| 国内精品久久久久久2021浪潮 | 午夜久久电影 | 国产精品免费小视频 | 日韩av电影在线免费观看 | 亚州综合网 | 成人午夜在线观看视频 | 蜜桃av网| 在线观看中文字幕av | 一区二区三区视频在线 | 黄色午夜剧场 | 美女wc| 亚洲精品无码不卡在线播放he | 国产一级小视频 | 特一级黄色毛片 | 狠狠干天天操 | 亚洲视频成人 | 欧美亚成人 | 古装三级在线观看 | 国产一区国产二区在线观看 | 国产精品久久久久久久久久东京 | 国产精品久久久乱弄 | 欧美 日韩 国产 在线 | 一级性生活免费视频 | 欧美亚洲一区二区三区四区 | 欧美日韩免费在线观看视频 | 91短视频网址 | 久久久日韩精品一区二区 | 欧美日韩一 | 国产91对白叫床清晰播放 | 暖暖免费观看高清完整版电影 | 91精品老司机 | 九九热在线免费观看视频 | 免费一级电影 | japanese javhd| 亚洲成人福利电影 | 久草网在线 | 黄色欧美精品 | 国产精品热 | 91一区二区在线观看 |