基于Java 數(shù)組內(nèi)存分配的相關(guān)問(wèn)題
可能Java 數(shù)組大家都很熟悉,最近我遇到了一個(gè)關(guān)于Java 數(shù)組內(nèi)存分配的問(wèn)題。
呵呵。突然就發(fā)現(xiàn)許多書(shū)上“基本數(shù)據(jù)類(lèi)型存儲(chǔ)在棧內(nèi)存當(dāng)中,對(duì)象則保存在堆內(nèi)存”這句話(huà)完全是錯(cuò)誤的。下面是個(gè)簡(jiǎn)單的例子代碼:
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ù)組大小是不能改變的”這可能大家都聽(tīng)過(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è)圖:
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)線(xiàn)是賦值語(yǔ)句: animal[0] = dog;
animal[1] = cat; 之前的變量指向的狀態(tài),紅虛線(xiàn)是賦值語(yǔ)句之后的狀態(tài),animal[0]和dog ,animal[1] 和cat 所指向的都是相同的堆內(nèi)存空間。
- Java DWR內(nèi)存泄漏問(wèn)題解決方案
- macOS上使用gperftools定位Java內(nèi)存泄漏問(wèn)題及解決方案
- Java內(nèi)存模型可見(jiàn)性問(wèn)題相關(guān)解析
- Java內(nèi)存泄漏問(wèn)題處理方法經(jīng)驗(yàn)總結(jié)
- 解決Java導(dǎo)入excel大量數(shù)據(jù)出現(xiàn)內(nèi)存溢出的問(wèn)題
- 完美解決java讀取大文件內(nèi)存溢出的問(wèn)題
- 詳解Java中synchronized關(guān)鍵字的死鎖和內(nèi)存占用問(wèn)題
- 解析Java的JNI編程中的對(duì)象引用與內(nèi)存泄漏問(wèn)題
- JAVA程序內(nèi)存溢出問(wèn)題原因分析
- Java中典型的內(nèi)存泄露問(wèn)題和解決方法
- Java 內(nèi)存安全問(wèn)題的注意事項(xiàng)
相關(guān)文章
基于idea解決springweb項(xiàng)目的Java文件無(wú)法執(zhí)行問(wèn)題
這篇文章給大家介紹了基于idea解決springweb項(xiàng)目的Java文件無(wú)法執(zhí)行問(wèn)題,文中通過(guò)圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02Logger.getLogger()與LogFactory.getLog()的區(qū)別詳解
LogFactory來(lái)自common-logging包。如果用LogFactory.getLog,你可以用任何實(shí)現(xiàn)了通用日志接口的日志記錄器替換log4j,而程序不受影響2013-09-09java 中 request.getSession(true、false、null)的區(qū)別
這篇文章主要介紹了java 中 request.getSession(true/false/null)的區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-02-02