• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    JAVA基礎:關于Java棧與堆的思考

    發布: 2008-6-04 15:00 | 作者: 不詳 | 來源: 賽迪網論壇 | 查看: 84次 | 進入軟件測試論壇討論

    領測軟件測試網


      值得注意的是,一般String類中字符串值都是直接存值的。但像String str = "abc";這種場合下,其字符串值卻是保存了一個指向存在棧中數據的引用!
     
      為了更好地說明這個問題,我們可以通過以下的幾個代碼進行驗證。

      String str1 = "abc";
      String str2 = "abc";
      System.out.println(str1==str2);  //true
     
      注意,我們這里并不用str1.equals(str2);的方式,因為這將比較兩個字符串的值是否相等。==號,根據JDK的說明,只有在兩個引用都指向了同一個對象時才返回真值。而我們在這里要看的是,str1與str2是否都指向了同一個對象。
      
      結果說明,JVM創建了兩個引用str1和str2,但只創建了一個對象,而且兩個引用都指向了這個對象。

      我們再來更進一步,將以上代碼改成:

      String str1 = "abc";
      String str2 = "abc";
      str1 = "bcd";
      System.out.println(str1 + "," + str2);  //bcd, abc
      System.out.println(str1==str2);  //false

      這就是說,賦值的變化導致了類對象引用的變化,str1指向了另外一個新對象!而str2仍舊指向原來的對象。上例中,當我們將str1的值改為"bcd"時,JVM發現在棧中沒有存放該值的地址,便開辟了這個地址,并創建了一個新的對象,其字符串的值指向這個地址。
      
      事實上,String類被設計成為不可改變(immutable)的類。如果你要改變其值,可以,但JVM在運行時根據新值悄悄創建了一個新對象,然后將這個對象的地址返回給原來類的引用。這個創建過程雖說是完全自動進行的,但它畢竟占用了更多的時間。在對時間要求比較敏感的環境中,會帶有一定的不良影響。

      再修改原來代碼:

      String str1 = "abc";
      String str2 = "abc";
     
      str1 = "bcd";
     
      String str3 = str1;
      System.out.println(str3);  //bcd

      String str4 = "bcd";
      System.out.println(str1 == str4);  //true
       
      str3 這個對象的引用直接指向str1所指向的對象(注意,str3并沒有創建新對象)。當str1改完其值后,再創建一個String的引用str4,并指向因str1修改值而創建的新的對象?梢园l現,這回str4也沒有創建新的對象,從而再次實現棧中數據的共享。

      我們再接著看以下的代碼。

      String str1 = new String("abc");
      String str2 = "abc";
      System.out.println(str1==str2);  //false

      創建了兩個引用。創建了兩個對象。兩個引用分別指向不同的兩個對象。

      String str1 = "abc";
      String str2 = new String("abc");
      System.out.println(str1==str2);  //false

      創建了兩個引用。創建了兩個對象。兩個引用分別指向不同的兩個對象。

      以上兩段代碼說明,只要是用new()來新建對象的,都會在堆中創建,而且其字符串是單獨存值的,即使與棧中的數據相同,也不會與棧中的數據共享。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    32/3<123>

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>