熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

關於String對象解析

2013-11-23 20:32:33  來源: Java開源技術 

  <PRE class=java name=code><FONT size=>class StringTest

  {

  public static void main(String[] args){

  String str = new String(abc);//此句代碼產生後在內存中會產生幾個對象?

  /*

  *分析首先Java會根據abc在String Pool(字符串池)中查找abc如果沒有該

  *字符串則在String Pool中創建一個對象然後在通過new關鍵字在Java內存堆棧中創建

  *一個abc對象並且由s變量指向它

  */

  String str = abc;//此句代碼產生後在內存中會產生幾個對象?

  /*

  *分析在執行第二句代碼時Java會依據上面的順序首先在String Pool中查找abc如果

  *找到有此項則變量str指向String Pool中的abc

  */

  Systemoutprintln(str == str);  //等號較的是內存地址   false

  Systemoutprintln(strequals(str));//比較的是值得內容   true

  String str = abc;

  Systemoutprintln(str == str);

  String str = new String(abc);//此句代碼產生後在內存中會產生幾個對象?

  /*

  *在執行第三句代碼時Java首先也會在String Pool中查找abc對象然後在內存堆棧

  *中創建一個新的對象abc並且str變量指向它

  */

  Systemoutprintln(str == str);    //flalse

  Systemoutprintln(strequals(str));  //true

  /*

  public String intern()返回字符串對象的規范化表示形式

  一個初始時為空的字符串池它由類 String 私有地維護

  當調用 intern 方法時如果池已經包含一個等於此 String 對象的字符串

  (該對象由 equals(Object) 方法確定)則返回池中的字符串

  否則將此 String 對象添加到池中並且返回此 String 對象的引用

  */

  Systemoutprintln(str == strintern()); //false

  Systemoutprintln(str == strintern());  //true

  Systemoutprintln(********************);

  String hello = hello;

  String hel = hel;

  String lo = lo;

  //在+兩邊都是常量字符串則將兩個字符串合並並且在String Pool中查找hello

  //並返回在String Pool中的內存地址正好也是hello變量的內存地址所以第一句代碼會輸出true

  Systemoutprintln(hello == hel + lo);//true

  Systemoutprintln(hello == hel + lo);//true

  //如果在+兩邊有一邊是引用類型變量Java會將合並成一個字符串並且在堆棧中創建一個

  //新的對象並且返回內存地址所以這句代碼是輸出false

  Systemoutprintln(hello == hel + lo);  //false

  Systemoutprintln(hello == hel+lo);     //false

  }

  }</FONT></PRE>


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28641.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.