91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

String s = new String("xyz")創建了幾個對象

發布時間:2021-10-26 17:16:02 來源:億速云 閱讀:151 作者:iii 欄目:編程語言

本篇內容主要講解“String s = new String("xyz")創建了幾個對象”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“String s = new String("xyz")創建了幾個對象”吧!

從方法區說起

常量池存在于方法區,而方法區在jdk1.7版本前后改變比較大,所以還是先來說說方法區的演變。

在jdk1.7版本之前,常量池存在于方法區,方法區是堆的一個邏輯部分,他有一個名字叫做非堆。

String s = new String("xyz")創建了幾個對象

1.7版本把字符串常量池放到了堆中。

String s = new String("xyz")創建了幾個對象

而在1.8以后,則是移除了永久代,方法區概念保留,方法區的實現改為了元空間,常量池還是在堆中。

String s = new String("xyz")創建了幾個對象

為什么要說方法區的改變,只是為了文章接下來的內容不會由于JDK的版本而產生分歧,接下來內容都會以jdk1.8版本作為基礎來討論。

String s = new String("xyz");

先來一段代碼

public class Test {      public static void main(String[] args) {          String s = "xyz";      }  }

接著我們javac編譯代碼,然后用javap來反編譯,執行javap -c Test

String s = new String("xyz")創建了幾個對象

從結果來看,ldc命令在常量池中創建了一個"xyz"的對象,然后把他推至操作數棧頂,然后astore保存到局部變量,return返回。

接著看第二段面試題中的代碼

public class Test {      public static void main(String[] args) {          String s = new String("xyz");      }  }

同樣反編譯分析

String s = new String("xyz")創建了幾個對象

很明顯,我們看到new 創建了一個String對象,同時ldc在常量池中創建了"xyz"字符串對象,之后invokespecial執行構造函數,astore_1賦值,return返回。

通過以上兩個例子,可以知道String s = new String("xyz"); 創建了2個對象,而有些答案說的3個對象,則是把引用s也算作一個對象。

還有答案說xyz存在就創建了2個,不存在就創建了3個(包含引用s),再來測試一下。

public class Test {      public static void main(String[] args) {          String s = "xyz";          String s2 = new String("xyz");      }  }

String s = new String("xyz")創建了幾個對象

從這里,很明顯的發現這就是我們例子1和2的一個結合,但是注意兩次ldc后面的#2,#號代表著索引,說明第二次new String("xyz")的時候并沒有重新創建xyz對象。

一些常見的指令助記符含義:

  1.  nop, 什么都不做。

  2.  aconst_null,將 null 推送至棧頂。

  3.  iconst_i(變量數字),將 int 型 i 推送至棧頂。同理有lconst_0,fconst_0這種你應該知道什么意思了

  4.  ldc,將 int,float 或 String 型常量值從常量池中推送至棧頂。

  5.  iload,將指定的 int 型局部變量推送至棧頂。

  6.  istore,將棧頂 int 型數值存入指定局部變量。同理astore_i代表將棧頂引用型數值存入第i個局部變量。

  7.  dup,復制棧頂數值并將復制值壓入棧頂。

  8.  invokevirtual,調用實例方法。

  9.  invokespecial,調用超類構造方法,實例初始化方法,私有方法。

  10.  invokestatic,調用靜態方法。

  11.  invokeinterface,調用接口方法。

  12.  invokedynamic,調用動態鏈接方法。

  13.  new,創建一個對象,并將其引用值壓入棧頂。

總結

到底創建了幾個對象呢?

  1.  如果xyz不存在,引用算對象的話,那就是3個

  2.  如果xyz不存在,引用不算對象的話,那就是2個

  3.  如果xyz存在,引用算對象的話,那就是2個

  4.  如果xyz存在,引用不算對象的話,那就是1個

到此,相信大家對“String s = new String("xyz")創建了幾個對象”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石屏县| 荔波县| 宜州市| 黄梅县| 二连浩特市| 砀山县| 宁武县| 泽普县| 衡山县| 左云县| 五华县| 磴口县| 思茅市| 浦江县| 青神县| 成安县| 建阳市| 皋兰县| 沾化县| 夹江县| 同德县| 前郭尔| 洛宁县| 汝城县| 兴国县| 内黄县| 宜兴市| 吉安市| 阳泉市| 中卫市| 西吉县| 县级市| 读书| 措美县| 威信县| 罗甸县| 肥城市| 顺平县| 南江县| 株洲市| 阿克苏市|