成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

工作10年后,再看String s = new String("xyz") 創建了幾個對象?

開發 后端
作為一個經典的面試題,到現在工作這么多年了我真是認為挺操蛋的一個問題,在網上到現在你仍然可以看見很多討論這個問題的人,其中不乏工作很多年的人都有爭論,我認為還是有必要來說一說這個問題的。

 這個問題相信每個學習java的同學都不陌生,作為一個經典的面試題,到現在工作這么多年了我真是認為挺操蛋的一個問題,在網上到現在你仍然可以看見很多討論這個問題的人,其中不乏工作很多年的人都有爭論,我認為還是有必要來說一說這個問題的。

從方法區說起

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

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

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

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

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

String s = new String("xyz");

先來一段代碼 

  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         String s = "xyz" 
  4.     }  

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

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

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

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

同樣反編譯分析

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

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

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

  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         String s = "xyz" 
  4.         String s2 = new String("xyz");  
  5.     }  

從這里,很明顯的發現這就是我們例子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個

當然,我認為引用肯定是不算對象的,最終答案應該是1或者2個,這個面試題說實話不應該出現在初級面試題里。 

 

責任編輯:龐桂玉 來源: Python中文社區
相關推薦

2021-08-16 08:01:09

String Java面試題

2019-01-22 08:27:50

比爾蓋茨微軟鮑爾默

2024-07-02 12:25:01

2018-04-26 18:25:11

華為

2019-03-25 08:30:20

騰訊互聯網

2009-03-04 09:59:04

職場心情痛苦

2016-04-13 10:52:12

2019-08-21 09:00:00

2019-07-12 15:21:21

加密貨幣銀行貨幣

2024-06-07 11:14:24

2009-09-22 09:25:45

Chrome谷歌

2023-12-26 14:18:08

2009-08-12 11:24:25

C# String對象

2009-07-30 09:07:22

云計算淘汰的工作云計算

2020-08-31 11:10:57

編程語言PythonJava

2015-08-18 15:14:47

2018-12-05 12:59:28

比特幣區塊鏈BTC

2017-04-10 13:25:30

2017-10-11 17:04:08

2011-03-10 10:36:59

寬帶光纖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产91久久久久久最新 | 国产 亚洲 网红 主播 | 尤物视频在线免费观看 | 99reav | 免费啪啪 | 人成久久| 久草.com | 日本在线黄色 | 欧美一区二区三区一在线观看 | 午夜欧美一区二区三区在线播放 | 日韩久久久久久 | 日本精品国产 | 欧美日在线| 久久另类视频 | 91精品国产综合久久久久久 | 成年人免费网站 | 超黄毛片 | 性色在线| 欧美亚洲网站 | 激情网站在线 | 成人一区二区在线 | 亚洲精品成人 | 亚洲午夜在线 | 国产精品区二区三区日本 | 人人干人人舔 | 一区欧美 | 日本在线看 | 成人亚洲精品 | 久久av网站 | 亚洲精品aⅴ | 国产99久久精品 | 国产成人久久 | 亚洲精品九九 | 91av在线电影 | 国产日韩一区二区三区 | 亚洲毛片在线观看 | 日本久久www成人免 成人久久久久 | 精品1区| 国产一区二区视频在线观看 | 99久久99| 狠狠操狠狠干 |