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

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

哪一個更有效,一個for-每個循環,還是一個迭代器

哪一個更有效,一個for-每個循環,還是一個迭代器

Go
慕田峪7331174 2019-12-16 12:12:00
哪一個更有效,一個for-每個循環,還是一個迭代器?哪一種方式是遍歷集合最有效的方法?List<Integer>  a = new ArrayList<Integer>();for (Integer integer : a) {   integer.toString();}或List<Integer>  a = new ArrayList<Integer>();for (Iterator iterator = a.iterator(); iterator.hasNext();) {    Integer integer = (Integer) iterator.next();    integer.toString();}請注意,這不是與這,這個, 這,這個, 這,這個,或這,這個雖然最后一個問題的答案之一已經接近尾聲。這不是一個欺騙的原因,因為其中大多數都是比較循環,您在其中調用。get(i)循環內部,而不是使用迭代器。如上所建議的元我將張貼我對這個問題的答案。
查看完整描述

3 回答

?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

區別不在于性能,而在于能力。當直接使用引用時,您比顯式使用迭代器(例如List.iterator()與List.listIterator(),盡管在大多數情況下它們返回相同的實現)更強大。您還可以在循環中引用Iterator。這允許您在不獲取ConcurrentModificationException的情況下從集合中刪除項。

G.

這沒問題:

Set<Object> set = new HashSet<Object>();// add some items to the setIterator<Object> setIterator = set.iterator();while(setIterator.hasNext()){
     Object o = setIterator.next();
     if(o meets some condition){
          setIterator.remove();
     }}

這不是,因為它將引發并發修改異常:

Set<Object> set = new HashSet<Object>();// add some items to the setfor(Object o : set){
     if(o meets some condition){
          set.remove(o);
     }}



查看完整回答
反對 回復 2019-12-19
?
慕仙森

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

為了擴展Paul自己的答案,他已經證明了字節碼在特定的編譯器上是相同的(大概是Sun的javac?)但是不同的編譯器不是生成相同的字節碼,對嗎?為了了解兩者之間的實際區別,讓我們直接進入源代碼,檢查Java語言規范,特別是14.14.2,“強化陳述”:

增強for語句等效于基本語句。for表格說明:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    VariableModifiers(opt) Type Identifier = #i.next();    
    Statement }

換句話說,JLS要求兩者是等價的。從理論上講,這可能意味著字節碼的邊際差異,但實際上,增強的for循環需要:

  • 調用

    .iterator()

    方法
  • 使用

    .hasNext()

  • 通過以下方式使局部變量可用

    .next()

因此,換句話說,就所有實際目的而言,字節碼將是相同的,或幾乎相同的。很難想象編譯器實現會導致兩者之間的任何顯著差異。



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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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