第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

通過添加 Enum 靜態(tài) Holder 進(jìn)行優(yōu)化

通過添加 Enum 靜態(tài) Holder 進(jìn)行優(yōu)化

炎炎設(shè)計(jì) 2021-11-17 14:34:21
我想知道添加Enum一個(gè)靜態(tài) Holder 是否總是比“get”Enum 方法(或類似用于獲取特定 Enum 值)上的迭代值更好的實(shí)現(xiàn)。例如對于 Spring HttpStatus當(dāng)前實(shí)現(xiàn):HttpStatus(int value, String reasonPhrase) {    this.value = value;    this.reasonPhrase = reasonPhrase;}public static HttpStatus valueOf(int statusCode) {    for (HttpStatus status : values()) {        if (status.value == statusCode) {            return status;        }    }    throw new IllegalArgumentException("No matching constant for [" + statusCode + "]");}可以通過以下方式優(yōu)化:private static class Holder {    private static Map<Integer, HttpStatus> enumMap = new HashMap<>();}HttpStatus(int value, String reasonPhrase) {    this.value = value;    this.reasonPhrase = reasonPhrase;    Holder.enumMap.put(value, this);}public static HttpStatus valueOf(int statusCode) {     return Holder.enumMap.computeIfAbsent(statusCode, statusCode -> {            throw new IllegalArgumentException("No matching constant for [" + statusCode + "]"); });}代碼優(yōu)化:循環(huán)版本具有線性時(shí)間復(fù)雜度(每個(gè)獲取值的請求),而使用 HashMap 的版本具有 O(1) 的時(shí)間復(fù)雜度。這個(gè)優(yōu)化是否有我遺漏的缺陷?
查看完整描述

2 回答

?
呼啦一陣風(fēng)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊

我很久以前就檢查過這種方法,我決定使用手動代替循環(huán)值沒有任何好處Map。

  • 地圖發(fā)生在內(nèi)存中

  • 要使 map with O(1)search 確實(shí)比O(n)手動循環(huán)好,enum 應(yīng)該有 1000 多個(gè)常量(這是實(shí)驗(yàn)數(shù)字)。但根據(jù)我的經(jīng)驗(yàn),我有最多 200 多個(gè)常量的枚舉國家。

  • 在最壞的情況下,這也不是整個(gè)應(yīng)用程序的瓶頸。

我總是使用手動循環(huán)并且不擔(dān)心性能。許多序列化框架(如 Jackson 將 enum 轉(zhuǎn)換為 json)使用Enum.valueOf().


查看完整回答
反對 回復(fù) 2021-11-17
?
DIEA

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊

要記住的一件事是,一旦初始化,靜態(tài)地圖將無限期地保存在內(nèi)存中;循環(huán)方法只會values()在循環(huán)迭代期間保存通過調(diào)用創(chuàng)建的數(shù)組。


但是,值得指出的是,使用 holder 類沒有任何優(yōu)勢:因?yàn)槟窃跇?gòu)造函數(shù)中添加到映射中的,所以在調(diào)用構(gòu)造函數(shù)時(shí)會立即初始化 holder 類。


因此,您也可以使用普通的舊靜態(tài)(最終)字段。


同樣值得考慮的是,這種方法必然要求映射是可變的。您可能不打算對其進(jìn)行變異,但是防御性地改變方法是值得的,這樣您就不能。


相反,您可以直接在字段上初始化:


static final Map<Integer, HttpStatus> map = 

    Collections.unmodifiableMap(

        Stream.of(HttpStatus.values())

            .collect(toMap(s -> s.value,  s -> s)));

(或使用類似 Guava 的東西ImmutableMap)


關(guān)于直接初始化映射的方法的另一點(diǎn)是它不會在構(gòu)造函數(shù)中添加到映射中——這意味著您實(shí)際上不必將其放入枚舉類本身。這使您可以靈活地在無法更改代碼的枚舉上使用它,和/或僅將地圖添加到您發(fā)現(xiàn)有性能需求的地方。


查看完整回答
反對 回復(fù) 2021-11-17
  • 2 回答
  • 0 關(guān)注
  • 203 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號