亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2013年05月21日 15:18:56   作者:  
本篇文章是對Java中數(shù)組內(nèi)存分配進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

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

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

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

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

上圖中藍(lán)線是賦值語句:        animal[0] = dog;
animal[1] = cat;          之前的變量指向的狀態(tài),紅虛線是賦值語句之后的狀態(tài),animal[0]和dog ,animal[1] 和cat 所指向的都是相同的堆內(nèi)存空間。

相關(guān)文章

  • 基于idea解決springweb項(xiàng)目的Java文件無法執(zhí)行問題

    基于idea解決springweb項(xiàng)目的Java文件無法執(zhí)行問題

    這篇文章給大家介紹了基于idea解決springweb項(xiàng)目的Java文件無法執(zhí)行問題,文中通過圖文結(jié)合的方式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 深入理解java中Arrays.sort()的用法

    深入理解java中Arrays.sort()的用法

    這篇文章主要介紹了深入理解java中Arrays.sort()的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 一文帶你掌握java8中的reduce操作

    一文帶你掌握java8中的reduce操作

    reduce?操作是一種通用的歸約操作,它可以實(shí)現(xiàn)從?Stream?中生成一個(gè)值,其生成的值不是隨意的,而是根據(jù)指定的計(jì)算模型,下面我們就來深入了解下java8中的reduce操作吧
    2023-12-12
  • 堆排序原理及算法代碼詳解

    堆排序原理及算法代碼詳解

    這篇文章主要介紹了堆排序算法的講解及Java版實(shí)現(xiàn),堆排序基于堆這種數(shù)據(jù)結(jié)構(gòu),在本文中對堆的概念也有補(bǔ)充介紹,需要的朋友可以參考下
    2021-08-08
  • Logger.getLogger()與LogFactory.getLog()的區(qū)別詳解

    Logger.getLogger()與LogFactory.getLog()的區(qū)別詳解

    LogFactory來自common-logging包。如果用LogFactory.getLog,你可以用任何實(shí)現(xiàn)了通用日志接口的日志記錄器替換log4j,而程序不受影響
    2013-09-09
  • JAVA導(dǎo)出CSV文件實(shí)例教程

    JAVA導(dǎo)出CSV文件實(shí)例教程

    這篇文章主要介紹了如何用JAVA導(dǎo)出CSV文件,文中案例代碼十分詳細(xì),對大家的學(xué)習(xí)有所幫助,感興趣的朋友可以了解下
    2020-06-06
  • spring boot 使用utf8mb4的操作

    spring boot 使用utf8mb4的操作

    這篇文章主要介紹了spring boot 使用utf8mb4的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java 中 request.getSession(true、false、null)的區(qū)別

    java 中 request.getSession(true、false、null)的區(qū)別

    這篇文章主要介紹了java 中 request.getSession(true/false/null)的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • SpringMVC圖片文件跨服務(wù)器上傳

    SpringMVC圖片文件跨服務(wù)器上傳

    這篇文章主要為大家詳細(xì)介紹了SpringMVC圖片文件跨服務(wù)器上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • SpringMVC底層執(zhí)行流程及原理解析

    SpringMVC底層執(zhí)行流程及原理解析

    這篇文章主要介紹了SpringMVC底層執(zhí)行流程及原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評(píng)論