關於建立String物件的抉擇
關於建立String物件的抉擇
標籤(空格分隔): 與String有關的那些事兒
轉自部落格:java String 兩種不同的賦值 比較
我的舊記憶
之前我的大腦還是有概念的,只是比較模糊,我知道建立一個String物件有幾種形式。
- String string=new String()
- String string=”jfirehj”
但是我是真不知道這兩種形式有沒有區別,因此在比較String 物件的時候,理解到不了位。
public class EmptyTest {
public static void main(String[] args) {
String s1 = "iiii";
String s2 = "iiii";
if(s1==s2){
System.out.println("you are right");
}
if (s1.equals(s2)) {
System.out.println("you are right again");
}
}
}
輸出是
you are right
you are right again
再來一次
public class EmptyTest {
public static void main(String[] args) {
String s1 = new String("iiii");
String s2 = new String("iiii");
if (s1 == s2) {
System.out.println("you are right");
}
if (s1.equals(s2)) {
System.out.println("you are right again");
}
}
}
輸出:
you are right again
使用new
是在堆上建立了兩個不同的物件。但是這個字串建立的怎麼來進行解釋呢?
新的認識
原來就還有一個常量池的概念。
類似普通物件,通過new 建立字串物件
String str = new String(“Hello”); 記憶體圖如下圖所示,系統會先建立一個匿名物件”Hello”存入堆記憶體(我們暫且叫它A),然後new關鍵字會在堆記憶體中又開闢一塊新的空間,然後把”Hello”存進去,並且把地址返回給棧記憶體中的str, 此時A物件成為了一個垃圾物件,因為它沒有被任何棧中的變數指向,會被GC自動回收
直接賦值
如String str = “Hello”; 首先會去緩衝池中找有沒有一個”Hello”物件,如果沒有,則新建一個,並且入池,所以此種賦值有一個好處,下次如果還有String物件也用直接賦值方式定義為“Hello”, 則不需要開闢新的堆空間,而仍然指向這個池中的”Hello”,原來如此
這段程式碼證明結論:
手動入池
即使使用new關鍵字,第一種方式賦值,也可以使用一個java中的手動入池指令,讓所建立的物件入池,以後依然可以背重複使用,利用下面兩段程式碼可以測試, 如下圖,結果顯然是false,因為二者的地址不同。
國際慣例:總結
通過常量池的形式可以很好的提高效率,因此提倡直接賦值
後話:為什麼String 可以直接賦值
開啟了String.class,有這麼一段介紹:
/**
* The <code>String</code> class represents character strings. All
* string literals in Java programs, such as <code>"abc"</code>, are
* implemented as instances of this class.
* <p>
* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable they can be shared. For example:
* <p><blockquote><pre>
* String str = "abc";
* </pre></blockquote><p>
* is equivalent to:
* <p><blockquote><pre>
* char data[] = {'a', 'b', 'c'};
* String str = new String(data);
* </pre></blockquote><p>
* Here are some more examples of how strings can be used:
* <p><blockquote><pre>
* System.out.println("abc");
* String cde = "cde";
* System.out.println("abc" + cde);
* String c = "abc".substring(2,3);
* String d = cde.substring(1, 2);
* </pre></blockquote>
* <p>
*/
通過上面的介紹,我們可以清楚,直接賦值的話,是通過編譯器在起作用,當你對”abc”沒有通過new建立時,他會自動預設給你呼叫建構函式new String(char value[]). 不顯式呼叫String的建構函式(通過new叫顯式呼叫),其實JDK編譯器會自動給你加上。
編譯器主動呼叫構造方法的情況出現很多次了也
相關文章
- [原創]關於Java String物件建立問題解惑Java物件
- offfer 抉擇???
- 技術的抉擇
- 建立了幾個String物件?物件
- 關於類的物件建立與初始化物件
- JavaScript 基礎(二) – 建立 function 物件的方法, String物件, Array物件JavaScriptFunction物件
- String s=new String("abc")建立了幾個物件?物件
- new String("yefeng")建立了幾個物件物件
- [緊急求救]關於動態建立物件的問題物件
- 敏捷工具:Scrum板與Kanban如何抉擇?敏捷工具:Scrum板與Kanban如何抉擇?敏捷Scrum
- 眾多程式語言如何抉擇
- 分散式之抉擇分散式鎖分散式
- 中國 Linux 面臨生死抉擇Linux
- 請教一個關於EJB建立物件時的問題物件
- 關於C++類的定義和物件的建立詳解C++物件
- 微服務時代元件化和服務化的抉擇微服務元件化
- ASP+和JSP之間的抉擇 (轉)JS
- String s="a"+"b"+"c",到底建立了幾個物件?物件
- 基於 Laravel 開發 ThinkSNS+ 中前端的抉擇(webpack/Vue)踩坑日記Laravel前端WebVue
- React 開發中面臨的九個重要抉擇React
- 新手入門的方向如何抉擇,懇求指點
- Redis的String物件Redis物件
- 續作開發者們的“抉擇”,還有玩家們的“喜怒”
- 總結那些艱難的抉擇、浪費的時間
- 【Java面試】new String("abc")到底建立了幾個物件?Java面試物件
- 面試題系列:new String("abc")建立了幾個物件面試題物件
- 元宇宙概念下 遊戲公司如何抉擇?元宇宙遊戲
- 關於DBA工具的選擇
- JS於string 和 json互轉物件JSON物件
- 關於string.Empty & "" & null 的討論Null
- IT程式設計師的抉擇:我要離開帝都了程式設計師
- ERP代理:渠道商沉浮之間的抉擇(轉)
- String物件的equals()與 = =物件
- 關於值物件的理解,疑惑物件
- 關於值物件的應用物件
- 關於物件的建造模式物件模式
- 關於物件導向的困惑!物件
- Kaldi關於Openfst版本的選擇NFS