我自己實現的不可變類是否會節省內存?也就是說,如果兩個引用需要引用相同的實例,即使有兩次單獨的嘗試來分配對象,它們也會引用相同的實例。這是一個Java問題。將不可變類保存內存?
0
A
回答
4
不是不變的,但你的設計使兩個引用引用同一個實例就是「保存」內存。不變性獨立於該決定。
1
首先:很難判斷它是否能節省內存,如果你不告訴我們要比較的話。
一般:不,不會自動。不可變的類不會自動保存內存,它們甚至會導致內存壓力增加,因爲每次你想改變它時都需要實例化一個新內存。
話雖這麼說,你可以得到一些內存節省出來的,如果你共享實例很多:因爲它們是不可變的,你可以避免做一個防守副本,只是使用它。這可以改善內存使用情況。
所以總結一下:單獨的不可變類通常不會使用更多或更少的內存。實際節省的是你如何使用它們。
0
你是混淆概念。類不可變的事實並不意味着你將「重用」以前的對象。
舉例來說,如果我做
ImmutableClass myImmu = new ImmutableClass(5);
ImmutableClass myImmu2 = new ImmutableClass(5);
我已經創建了兩個不同的對象(即使他們實現平等的()返回true)。
另一件事是池/緩存,在那裏你保存已創建實例的列表,而不是調用構造函數,而是調用一個Factory方法,它可以爲你提供一個先前緩存的實例。不可變類更容易進行池/緩存,因爲它們的狀態僅取決於構造函數,所以您確定它沒有改變。
private static Map<Integer, InmutableClass> pool = ...
public static InmutableClass getInstance(int param) {
InmutableClass returnValue = pool.get(param);
if (returnValue == null) {
returnValue = new InmutableClass(param);
pool.put(param, returnValue);
}
return returnValue;
}
當然,如果你的實例很少被重用,你會在這個模式下使用更多的內存。
相關問題
- 1. 休眠保存(內部?)類變量
- 2. 保存內容的包括可變
- 3. 將XML內容保存到變量
- 4. 將變量保存在父類中PHP
- 5. 將可變數據保存到磁盤
- 6. 保護內存不被改變
- 7. 初始化一個將保存內部類的變量
- 8. 如何將內部類(Response.Listener)的變量值保存到外部?
- 9. 將可變內容保存到文本文件
- 10. 保存XDocument而不將其存儲在內存中
- 11. 保存到類變量
- 12. Android:活動將變量保存在內存中
- 13. 如何將變量值保存在內存中?
- 14. textarea保存將不會保存breakline
- 15. 將視頻保存到內部存儲
- 16. 將temparay信息保存在內存中
- 17. 將word.doc保存到內存流中
- 18. 將圖像保存到內存
- 19. 將圖片保存到內存中
- 20. 將數據保存在內存中
- 21. 將AVAudioPlayer聲音保存在內存中
- 22. 將數據保存到黑莓內存
- 23. 將密碼保存在內存中
- 24. 將數據保存到內部存儲
- 25. 保存不可序列化的類
- 26. 將變量保存到CharField
- 27. 不可變對象的內存管理
- 28. 將數據保存在內存中而不是保存在數據庫中java
- 29. Java擴展類不保存變量,它可以做到嗎?
- 30. PHP內存類或變量
如果你說'新',你分配新的對象。 JVM不會嘗試搜索現有對象並檢查是否完全相同。 –
除了達到256的整數,如果我正確地記得] :) – SJuan76
如果您使用新的Integer() - 否,它不會使用緩存。如果使用Integer.valueOf(),或者Integer i = 1(通過編譯器將其轉換爲Integer.valueOf()),則會進行隱式轉換。 – BegemoT