亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Java 如何處理在 for 循環中使用 getter 的情況?

Java 如何處理在 for 循環中使用 getter 的情況?

MMTTMM 2021-12-01 17:15:30
例如,如果我有以下 for 循環聲明。for(Foo f : fooService.getFooList()){}首先調用getter并將其分配給臨時對象是否更有效,List<Foo> fooList = fooService.getFooList();還是可以使用內聯getter?
查看完整描述

3 回答

?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

在這種特定情況下,使用 foreach 循環,我希望您的代碼將編譯為如下所示:


Iterator<Foo> it = fooService.getFooList().iterator();

while (it.hasNext()) {

    Foo foo = it.next();

    // ...

}

所以在這種情況下,它沒有區別。


但是,如果您要使用不同類型的循環,則可能會有所不同。例如:


for(int i = 0; i < fooService.getFooList().size(); i++){

    Foo foo = fooService.getFooList().get(i);

    // ...

}

如果您的列表暴露于外部修改,那么編譯器不太可能證明列表大小不會改變,因此它將調用getFooList().size()每次迭代來與 進行比較i,因此會稍微增加一些開銷。


但請注意,如果列表大小發生變化,則會i < fooService.getFooList().size()反映這一點。如果您意識到這一點,這可能很有用,但如果您不知道,則很危險。


如果您知道列表大小不會改變,那么您可以執行以下操作來消除該開銷(或者,Iterator如果不需要索引,則只需使用或增強的 for-each 循環):


List<Foo> fooList = fooService.getFooList();

final int fooListSize = fooList.size();

for(int i = 0; i < fooListSize ; i++){

    Foo foo = fooList.get(i);

    // ...

}

盡管如此,與微觀優化相比,您可能更喜歡可讀性。


但是,如果您的應用程序對運行時敏感,并且您的列表很大并且這些小檢查正在累加,那么您可能想要執行上述操作。


查看完整回答
反對 回復 2021-12-01
?
Qyouu

TA貢獻1786條經驗 獲得超11個贊

首先分配給 List 引用并不是更有效,但是根據您要執行的操作,擁有該引用可能很有用。


查看完整回答
反對 回復 2021-12-01
?
泛舟湖上清波郎朗

TA貢獻1818條經驗 獲得超3個贊

如果您擔心的是獲得每個價值的fooService.getFooList()調用n時間,請f忽略該想法。這將調用getFooList()一次并迭代其結果。


例如在以下代碼段中:


class Ideone

{

    private static List<String> list = Arrays.asList("A", "B", "C");


    public static void main (String[] args) throws java.lang.Exception

    {

        for(String f : getFooList()){

           System.out.println(f);

        }

    }


    private static List<String> getFooList() {

        System.out.println("getFooList called");

        return list;

    }

}

getFooList called僅打印一次,這表明該方法getFooList()僅被 for 循環調用一次。之后,打印A, B, C,對從方法調用獲得的元素進行迭代。


所以,在效率方面,它是相同的直接調用吸氣劑或將其分配給一個變量,并利用該用于執行迭代。


查看完整回答
反對 回復 2021-12-01
  • 3 回答
  • 0 關注
  • 235 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號