String s=new String("abc")建立了幾個物件?
String str=new String("abc"); 緊接著這段程式碼之後的往往是這個問題,那就是這行程式碼究竟建立了幾個String物件呢?
相信大家對這道題並不陌生,答案也是眾所周知的,2個。
接下來我們就從這道題展開,一起回顧一下與建立String物件相關的一些JAVA知識。
我們可以把上面這行程式碼分成String str、=、"abc"和new String()四部分來看待。String str只是定義了一個名為str的String型別的變數,因此它並沒有建立物件;=是對變數str進行初始化,將某個物件的引用(或者叫控制程式碼)賦值給它,顯然也沒有建立物件;現在只剩下new String("abc")了。那麼,new String("abc")為什麼又能被看成"abc"和new String()呢?
我們來看一下被我們呼叫了的String的構造器:
public String(String original) { //other code ... } 大家都知道,我們常用的建立一個類的例項(物件)的方法有以下兩種:
一、使用new建立物件。
二、呼叫Class類的newInstance方法,利用反射機制建立物件。
我們正是使用new呼叫了String類的上面那個構造器方法建立了一個物件,並將它的引用賦值給了str變數。同時我們注意到,被呼叫的構造器方法接受的引數也是一個String物件,這個物件正是"abc"。由此我們又要引入另外一種建立String物件的方式的討論——引號內包含文字。
這種方式是String特有的,並且它與new的方式存在很大區別。
String str="abc";
毫無疑問,這行程式碼建立了一個String物件。
String a="abc"; String b="abc"; 那這裡呢?
答案還是一個。
String a="ab"+"cd"; 再看看這裡呢?
答案是三個。說到這裡,我們就需要引入對字串池相關知識的回顧了。
在JAVA虛擬機器(JVM)中存在著一個字串池,其中儲存著很多String物件,並且可以被共享使用,因此它提高了效率。由於String類是final的,它的值一經建立就不可改變,因此我們不用擔心String物件共享而帶來程式的混亂。字串池由String類維護,我們可以呼叫intern()方法來訪問字串池。
我們再回頭看看String a="abc";,這行程式碼被執行的時候,JAVA虛擬機器首先在字串池中查詢是否已經存在了值為"abc"的這麼一個物件,它的判斷依據是String類equals(Object obj)方法的返回值。如果有,則不再建立新的物件,直接返回已存在物件的引用;如果沒有,則先建立這個物件,然後把它加入到字串池中,再將它的引用返回。因此,我們不難理解前面三個例子中頭兩個例子為什麼是這個答案了。
只有使用引號包含文字的方式建立的String物件之間使用“+”連線產生的新物件才會被加入字串池中。對於所有包含new方式新建物件(包括null)的“+”連線表示式,它所產生的新物件都不會被加入字串池中,對此我們不再贅述。因此我們提倡大家用引號包含文字的方式來建立String物件以提高效率,實際上這也是我們在程式設計中常採用的。
棧(stack):主要儲存基本型別(或者叫內建型別)(char、byte、short、int、long、float、double、boolean)和物件的引用,資料可以共享,速度僅次於暫存器(register),快於堆。
堆(heap):用於儲存物件
相關文章
- 【Java面試】new String("abc")到底建立了幾個物件?Java面試物件
- 面試題系列:new String("abc")建立了幾個物件面試題物件
- new String("yefeng")建立了幾個物件物件
- 建立了幾個String物件?物件
- String s = new String(" a ") 到底產生幾個物件?物件
- String s="a"+"b"+"c",到底建立了幾個物件?物件
- JAVA面試題 String s = new String("xyz");產生了幾個物件?Java面試題物件
- String a = "abc" 與String b = new String("abc")的區別
- String s = “hello“和String s = new String(“hello“)的區別
- 轉:經典String str = new String("abc")記憶體分配問題記憶體
- 【JDK】分析 String str=““ 與 new String()JDK
- 【JAVA】Java中 File f=new File(String parent ,String child)Java
- Javascript String物件方法JavaScript物件
- Redis的String物件Redis物件
- 常見物件-String類物件
- String物件的equals()與 = =物件
- String和StringBuffer的幾個小程式
- JavaScript 複習之 String 物件JavaScript物件
- 常見物件-String類-2物件
- 常見物件-String類-3物件
- 常見物件-String類-4物件
- Integer.valueof(String s)和Integer.parseInt(String s)的具體區別是什麼?
- String,String Builder,String Buffer-原始碼UI原始碼
- Java String 物件,你瞭解多少?Java物件
- JavaScript String 物件擴充套件方法JavaScript物件套件
- 動態字串%d %s ------android String字串Android
- Failed to execute user defined function(anonfun$concatStr$1: (map<string,string>, string) => string)AIFunction
- 幾張圖輕鬆理解String.intern()
- ava String 物件,你真的瞭解了嗎?物件
- js字串string轉object物件 - 方法篇JS字串Object物件
- 關於建立String物件的抉擇物件
- Array String物件的方法和屬性物件
- JavaScript String 物件例項深入研究JavaScript物件
- 2020-11-23Command物件的三個主要方法和String and String Builder類 字串建造物件UI字串
- java.lang.String 與stringJava
- JavaScript 基礎(二) – 建立 function 物件的方法, String物件, Array物件JavaScriptFunction物件
- String
- 關於java中String字元轉碼的幾個小測試Java字元