一文詳解Java中Integer是如何應(yīng)用享元模式的
什么是享元模式?
享元模式(Flyweight Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,其核心思想是通過(guò)共享技術(shù)有效地支持大量細(xì)粒度對(duì)象的復(fù)用,從而減少內(nèi)存中對(duì)象的數(shù)量,降低系統(tǒng)資源消耗。
享元模式適用于以下場(chǎng)景:
- 系統(tǒng)中存在大量相似或重復(fù)的對(duì)象;
- 這些對(duì)象的大部分狀態(tài)可以外部化(即可以抽離為外部參數(shù));
- 對(duì)象的內(nèi)部狀態(tài)(享元對(duì)象共享的部分)一旦創(chuàng)建就不改變(通常是不可變的);
- 應(yīng)用需要在性能和內(nèi)存之間取得平衡。
享元模式通常包含以下幾個(gè)角色:
- Flyweight(抽象享元類(lèi)):定義對(duì)象的接口,通過(guò)參數(shù)接受外部狀態(tài);
- ConcreteFlyweight(具體享元類(lèi)):實(shí)現(xiàn)抽象享元接口,內(nèi)部狀態(tài)存儲(chǔ)在對(duì)象內(nèi)部;
- UnsharedConcreteFlyweight(非共享享元類(lèi)):不共享的對(duì)象,通常作為組合結(jié)構(gòu)的一部分;
- FlyweightFactory(享元工廠):創(chuàng)建并管理享元對(duì)象,確保共享對(duì)象不被重復(fù)創(chuàng)建;
- Client(客戶(hù)端):維持對(duì)享元對(duì)象的引用,并計(jì)算/傳遞外部狀態(tài)。
享元模式的關(guān)鍵在于區(qū)分內(nèi)部狀態(tài)(共享、不變)和外部狀態(tài)(由客戶(hù)端維護(hù)、隨環(huán)境變化)。
Java中Integer是如何應(yīng)用享元模式的?
Java 中的 Integer 類(lèi)通過(guò) IntegerCache 實(shí)現(xiàn)了享元模式。在 Integer.valueOf(int i) 方法中,對(duì) -128 到 127 范圍內(nèi)的整數(shù)進(jìn)行了緩存:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
這意味著:
? 在 -128 到 127 范圍內(nèi),使用 Integer.valueOf() 或自動(dòng)裝箱時(shí),會(huì)返回緩存池中的同一個(gè)對(duì)象實(shí)例:
Integer a = 100; Integer b = 100; System.out.println(a == b); // true —— 同一個(gè)對(duì)象引用
? 超出該范圍時(shí),每次都會(huì)創(chuàng)建新對(duì)象:
Integer x = 200; Integer y = 200; System.out.println(x == y); // false —— 不同對(duì)象引用
?? 注意:應(yīng)使用 .equals() 方法比較值是否相等,而不是 ==(后者比較的是引用)。
該緩存范圍可通過(guò) JVM 參數(shù)
-XX:AutoBoxCacheMax=N調(diào)整上限(下限固定為 -128)。
這種設(shè)計(jì)減少了小整數(shù)頻繁創(chuàng)建對(duì)象的開(kāi)銷(xiāo),是享元模式的經(jīng)典應(yīng)用。
享元模式的其他應(yīng)用?
String 常量池
Java 中的字符串字面量會(huì)被緩存在字符串常量池中,相同的字符串字面量共享同一對(duì)象:String s1 = "hello"; String s2 = "hello"; System.out.println(s1 == s2); // true
數(shù)據(jù)庫(kù)連接池 / 線程池
雖然不完全符合傳統(tǒng)享元定義,但思想類(lèi)似 —— 復(fù)用昂貴資源,避免重復(fù)創(chuàng)建和銷(xiāo)毀。GUI 系統(tǒng)中的字體、顏色對(duì)象
在圖形界面中,相同字體或顏色對(duì)象可被多個(gè)控件共享,避免重復(fù)實(shí)例化。游戲開(kāi)發(fā)中的粒子系統(tǒng)
大量相似粒子(如爆炸火花、雨滴)共享紋理、行為等內(nèi)部狀態(tài),位置、速度等作為外部狀態(tài)傳入。文本編輯器中的字符對(duì)象
每個(gè)字符(如 ‘a’)在文檔中可能重復(fù)出現(xiàn)成千上萬(wàn)次,享元模式可讓所有 ‘a’ 共享同一個(gè)字符對(duì)象,僅位置、樣式等作為外部狀態(tài)。Java 中的
Boolean、Byte、Short、Long、Character緩存
類(lèi)似Integer,這些包裝類(lèi)也對(duì)部分值范圍做了緩存(如Boolean緩存TRUE和FALSE,Character緩存 0~127)。
? 總結(jié):享元模式在需要“大量重復(fù)對(duì)象 + 內(nèi)存敏感”的場(chǎng)景中非常有用,是空間換時(shí)間的經(jīng)典優(yōu)化手段。
到此這篇關(guān)于Java中Integer是如何應(yīng)用享元模式的的文章就介紹到這了,更多相關(guān)Java中Integer應(yīng)用享元模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(50)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-08-08
java中Timer定時(shí)器的使用和啟動(dòng)方式
這篇文章主要介紹了java中Timer定時(shí)器的使用和啟動(dòng)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
JDBC 與 MyBatis從基礎(chǔ)到實(shí)踐
JDBC(Java Database Connectivity)即 Java 數(shù)據(jù)庫(kù)連接,是 Java 語(yǔ)言中用來(lái)規(guī)范客戶(hù)端程序如何來(lái)訪問(wèn)數(shù)據(jù)庫(kù)的應(yīng)用程序接口,提供了諸如查詢(xún)和更新數(shù)據(jù)庫(kù)中數(shù)據(jù)的方法,這篇文章主要介紹了JDBC 與 MyBatis從基礎(chǔ)到實(shí)踐,需要的朋友可以參考下2025-04-04
java開(kāi)發(fā)之Jdbc分頁(yè)源碼詳解
這篇文章主要介紹了java開(kāi)發(fā)之Jdb分頁(yè)源碼詳解,需要的朋友可以參考下2020-02-02
Mybatis-Plus使用p6spy對(duì)SQL性能進(jìn)行監(jiān)控的方法
這篇文章主要介紹了Mybatis-Plus使用p6spy對(duì)SQL性能進(jìn)行監(jiān)控的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java數(shù)學(xué)工具類(lèi)MathUtil詳解
這篇文章主要為大家詳細(xì)介紹了Java數(shù)學(xué)工具類(lèi)MathUtil的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08
Java操作itextpdf實(shí)現(xiàn)PDF添加文字,圖片和簽名
這篇文章主要為大家詳細(xì)介紹了Java如何操作itextpdf實(shí)現(xiàn)PDF添加文字,圖片和簽名等功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2025-01-01

