java 字符串驻留_java String 以及字符串直接量 与 字符串驻留池 ...
結果輸出 :fancydeepin這是怎么回事?不是說 String 是不可變的字符串嗎?怎么這里又變了?是這樣的,在這里 name 只是一個引用類型變量,并不是一個 String 對象,@1中創建了一個?"fancy" 的字符串對象,@2中創建了一個?"fancydeepin" 的字符串對象,name 引用 (就像一個指針) 剛開始是指向 "fancy" 對象,而后,name 又重新指向 "fancydeepin" 對象,在示例代碼中,整個過程只創建了兩個 String 對象 (不知道我這樣說你能不能理解,為什么是只創建了兩個 String 對象?而不是 1個、3個...@3),一個是 "fancy" 對象,另外一個是 "fancydeepin" 對象。而這兩個對象被創建出來后并沒有被改變過,之所以程序會輸出 fancydeepin,完全只是因為name 引用所指向的對象發生了改變。如果你是本著認真的態度看著我的貼子,細心的你,是否會留意到:當 name 引用重新指向另外一個對象的時候,那 name 之前引用的對象 ( "fancy" 對象 ) JVM 在底層會怎么處理它呢?是會立即來回收它來釋放系統資源嗎?答案是否定的。雖然這時候程序再也不訪問 "fancy" 這個對象,但 JVM 還是不會來回收它,它將在程序運行期間久駐內存,為什么會這樣呢?再往下說就扯到 java 的內存管理機制了,這里點到即止。在這里你可以簡單的將它理解成 "fancy" 對象被緩存了起來 (?實際上也是因為被緩存了 )。
字符串駐留池當比較兩個 String 對象時候,是應該用 "==" 呢?還是應該選擇 equals 呢?相信絕大部分人絕大多時候使用的都是選擇用 equals 方法。"==" 和 equals 的用法相信大家都很熟悉了,"==" 比較的是兩個對象的哈希碼值是否相等,而 equals 比較的是對象的內容是否一樣。而絕大部分時候我們比較兩個 String 對象的時候只是想比較它們的內容是否相等,這樣看來,只能選 equals 了,但真的是這樣嗎?答案是否定的。你一樣也可以用 "==" 來完成這樣的一件事情,而且 "==" 的效率無論如何都是要比使用 equals 的效率要高的,但前提是,需要使用字符串的駐留池,才能使用 "==" 來替代 equals 作比較。String 里面有個方法叫 intern(),執行效率很高,但也許你還不曾用過,下面是摘自API中 intern() 方法的描述:“當調用 intern 方法時,如果池已經包含一個等于此 String 對象的字符串(用equals(Object)方法確定),則返回池中的字符串。
否則,將此 String 對象添加到池中,并返回此 String 對象的引用。它遵循以下規則:
對于任意兩個字符串 s 和 t,當且僅當 s.equals(t) 為 true 時,s.intern()?==?t.intern()才為true。 ”
示例代碼:
總結
以上是生活随笔為你收集整理的java 字符串驻留_java String 以及字符串直接量 与 字符串驻留池 ...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 注解 权限_java 使用注解
- 下一篇: java gridbag_java –