『壹』 java常量池是什麼有什麼用 和堆、棧有關系求簡單易懂的解釋!
1.寄存器:最快的存儲區, 由編譯器根據需求進行分配,我們在程序中無法控制.
2. 棧:存放基本類型的變數數據和對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字元串常量對象存放在常量池中。)
3. 堆:存放所有new出來的對象。
4. 靜態域:存放靜態成員(static定義的)
5. 常量池:存放字元串常量和基本類型常量(public static final)。
6. 非RAM存儲:硬碟等永久存儲空間
這里我們主要關心棧,堆和常量池,對於棧和常量池中的對象可以共享,對於堆中的對象不可以共享。棧中的數據大小和生命周期是可以確定的,當沒有引用指向數據時,這個數據就會消失。堆中的對象的由垃圾回收器負責回收,因此大小和生命周期不需要確定,具有很大的靈活性。
對於字元串:其對象的引用都是存儲在棧中的,如果是編譯期已經創建好(直接用雙引號定義的)的就存儲在常量池中,如果是運行期(new出來的)才能確定的就存儲在堆中。對於equals相等的字元串,在常量池中永遠只有一份,在堆中有多份。
『貳』 項目中的常量是放在介面里還是放在類里呢
《Java與模式》 ,裡面提了一句不建議使用常量介面,甚至舉了個java源碼的反例。
1、常量類應該是final,不變的,而介面里的參數是final,也是不變的。
那麼,看起來介面是放常量沒有一定問題,還省去了final的輸入,非常的合適。
但是,類是只能單繼承的,介面是允許多實現的。
要是類實現的多個介面出現重名的常量,會報錯,必須要在實現類明確常量用的是哪個介面的。
雖然這可以說是架構師設計的問題,但是,架構師這么做就違反了依賴倒轉原則,這玩意就不細說了。
2、如果某個實現了常量介面的類被修改不再需要常量了,也會因為序列化兼容原因不得不保持該實現,而且非final類實現常量介面會導致所有子類被污染。
這個應該很少人遇到過,不過這是 Effective Java 裡面說的。
具體的理解就是,能被序列化的一定是數據,
那麼突然改了數據結構,可能導致老版的數據無法被反序列化,而新版的數據會有冗雜的數據,
要是折騰個幾次,網路傳輸協議 這個無法通過時間或者空間提升的玩意就能逼死你了。
3、基於數據只暴露給相應的類的原則,一個類實現一個常量介面,可能只需要其中幾個常量,而得到了更多無用的常量,
所以,使用常量介面的時候都是
1.介面是定義類型的,而不應該用於導出常量。常量介面不建議使用,應使用常量類。
2.訪問:介面. 常量 , 因為在介面定義 常量 默認是 static 的。
大佬的分析: http://www.360doc.com/content/14/1210/17/16650130_431828218.shtml