欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

java內存分配和String的不變性

系統 1890 0

轉載請出自出處: http://eksliang.iteye.com/blog/2146549

http://eksliang.iteye.com

一.java分配內存涉及的區域包括

    1. 寄存器
    2. 常量池
    3. 靜態存儲域

二.寄存器介紹

? ? ? 寄存器是最快的內存區域,因為他保存在處理器內部,這塊區域我們沒有直接的控制權,也不可能在代碼里面找到寄存器的任何存在蹤跡,所以這塊不做討論

?

三.常量池介紹

1.常量池是什么?

答:他是在.class文件中開避的一塊內存區域,用來存儲在編譯期間就可以確定一些數據

? ? ? ?例如:String str="think";think在編譯的期間就是可識別的常量,就能加進常量池

2.常量池中的數據是在什么時候加載進內存的?

答:在類被編譯成.class文件時,加載進來的

3.常量池中都放些什么東西?

答:包括如下信息

  1. String類型的變量;例如String str="think",不是new String("think");
  2. 對象的常量值
  3. 類的全限類名以及他的描述符;屬性的名稱跟描述符;方法的名稱跟描述符

4.String的不變性

1.什么是String的不變性?

答:所謂String的不可變性,是說一旦字符串被創建,對其所做的任何修改都會生成 新的 字符串對象(來源于《think in java》)

接下來看下他的源碼

      public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;

    /**
     * Class String is special cased within the Serialization Stream Protocol.
     *
     * A String instance is written initially into an ObjectOutputStream in the
     * following format:
     * <pre>
     *      <code>TC_STRING</code> (utf String)
     * </pre>
     * The String is written by method <code>DataOutput.writeUTF</code>.
     * A new handle is generated to  refer to all future references to the
     * string instance within the stream.
     */
    private static final ObjectStreamField[] serialPersistentFields =
            new ObjectStreamField[0];
    

?通過源碼我們可以看到這個類他的所有屬性,以及類都是final關鍵字修飾,也就是說他在內存中只有一份拷貝,也就是說當創建一個新的字符串,他會去常量池中找如果這個串存在就直接引用,如果沒有就創建

例如:如下三句代碼的意思是

      1)String s1="aabbcc";
2)		String s2="aabbcc";
3)		s1="aa";
    

?他的含義入下圖所示:

當程序執行到(1)時如圖在常量池中創建"aabbcc"


java內存分配和String的不變性
?

當程序執行到(2)時如圖所示,因為已經存在了,就直接引用,(實際上內部在創建一個字符串時,他會先去變量常量池,查找看當前創建的字符串是否存在,如果存在就直接引用,沒有就創建)


java內存分配和String的不變性
?

當程序執行到(3)時如圖所示,因為修改了字符串s1的值,所以他會在內存中創建一個新字符串,原來指向aabbcc的指針斷開,指向“aa”

?


java內存分配和String的不變性
?

四.棧

1.棧中存放的是那些數據?

答:存放基本類型的變量數據和對象的引用,但對象本身并不存放在棧中,而是存放在堆中或者常量池中(字符串、常量對象存放在常量池中)

? ? ? ?當在一段代碼塊定義一個變量時,JVM就在棧中為這個變量分配內存空間,當該變量退出該作用域后,JVM會自動釋放掉為該變量所分配的內存空間,該內存空間可以立即被另作他用。

2.實際存儲在哪里?

答:數據駐留在RAM(隨機存儲器)區域;

何為隨機存儲器?答:是與CPU直接交換數據的內部存儲器,也叫主存或者內存,它可以隨時讀寫,而且速度很快,通常作為操作系統或正在運行中的程序的臨時數據存儲媒介

?

五.堆

1.存放的是那些數據?

答:存放所有new 出來的對象。或者通過反射創建的對象

2.實際數據存儲在哪里?

答:數據駐留在RAM(隨機存儲器)區域

?

六.靜態存儲域

1.存放的是那些數據?

答:存放的是靜態成員(static定義),這兒的靜態(static)是指"位置固定位置"。程序運行期間,靜態存儲的數據將隨時等候調用。可用static關鍵字指出一個對象的一個屬性或者方法是靜態的,但是JAVA對象永遠不會保持到靜態存儲區

?

?

?

?

??

java內存分配和String的不變性


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩色小说 | 五月天婷婷免费观看视频在线 | 日韩影音 | 国产视频资源在线观看 | 久久久99精品久久久 | 一区二区三区免费视频观看 | 久草视频在线资源 | 色综合加勒比 | 2022最新a精品视频在线观看 | 人妻熟女久久久久久久 | 欧美成人午夜影院 | 人人草视频在线 | 久草福利 | 一级毛片 在线播放 | 日本久久久久久 | 亚洲AV久久久久久久无码 | 夜干夜干2017最新网站 | 色播视频在线播放 | 中文字幕无线码一区二区三区 | 九色视频网址 | 日日舔夜夜操 | 精品啪啪| 精品福利视频一区二区三区 | 青青草视频网 | 国产精品成人免费观看 | 欧美日韩一区二区三 | 97超碰免费 | 国产在线视频色综合 | 久久精品| 国产人成激情视频在线观看 | 日本免费小视频 | 成人区视频爽爽爽爽爽 | 好吊日免费视频 | 久久精品一| 午夜视频一区二区 | 欧美精品一区三区 | www.91在线观看| 国产日韩一区二区三免费高清 | 日韩一区二区在线观看 | 欧美另类性视频 | 一级片在线免费观看视频 |