<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### 集合元素在內存如何存放 數據元素在內存中,主要有2種存儲方式: 1、順序存儲,Random Access(或直接存儲,Direct Access): 這種方式,相鄰的數據元素存放于相鄰的內存地址中,整塊內存地址是連續的。可以根據元素的位置直接計算出內存地址,直接進行讀取。讀取一個特定位置元素的平均時間復雜度為O(1)。這種數據結構插入和刪除時比較麻煩,查詢比較方便。正常來說,只有基于數組實現的集合,才有這種特性。Java中以ArrayList為代表; 2、鏈式存儲,Sequential Access: 這種方式是將數據元素放在獨立的空間中,在內存中每個元素的內存地址都不要求是相鄰的。所以每個元素中需要保存下一個元素的索引,即下一個元素的內存地址。所以這種數據結構插入和刪除比較方便,但是查找很麻煩,要從第一個開始遍歷,因為它無法根據元素的位置直接計算出內存地址,只能按順序讀取元素。讀取一個特定位置元素的平均時間復雜度為O(n)。主要以鏈表為代表。Java中以LinkedList為代表; ### Java集合遍歷方式 1)傳統的for循環遍歷基于計數器 遍歷者自己在集合外部維護一個計數器,然后依次讀取每一個位置的元素,直到讀取到最后一個元素后。主要就是需要按元素的位置來讀取元素,適合于遍歷順序存儲的數據結構; ``` for (int i = 0; i < list.size(); i++) { list.get(i); } ``` 2)迭代器遍歷Iterator Iterator本來是OO的一個設計模式,主要目的就是屏蔽不同數據集合的特點,統一遍歷集合的接口。從結構上可以看出,迭代器模式在客戶與容器之間加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器內部細節的暴露,而且也使得設計符號“單一職責原則”; 每一個具體實現的數據集合,一般都需要提供相應的Iterator。相比于傳統for循環,Iterator取代了顯式的遍歷計數器。所以基于順序存儲集合的Iterator可以直接按位置訪問數據。而基于鏈式存儲集合的Iterator,正常的實現都是需要保存當前遍歷的位置,然后根據當前位置來向前或者向后移動指針 迭代器模式的寫法如下: ``` Iterator iterator = list.iterator(); while (iterator.hasNext()) { iterator.next(); } ``` 3)foreach循環遍歷 foreach內部也是采用了Iterator的方式實現,根據反編譯的字節碼可以發現,foreach內部也是采用了Iterator的方式實現,只不過Java編譯器幫我們生成了這些代碼 優點:代碼簡潔,不易出錯 缺點:只能做簡單的遍歷,不能在遍歷過程中操作(刪除、替換)數據集合 ``` for (ElementType element : list) { } ``` ### 遍歷性能 1)傳統的for循環遍歷基于計數器 ArrayList按位置讀取的代碼:直接按元素位置讀取 ``` public E get(int index) { rangeCheck(index); return elementData(index); } E elementData(int index) { return (E) elementData[index]; } ``` LinkedList按位置讀取的代碼:如果index小于容量的一半,則從頭開始查找,否則從尾部開始查找 ``` public E get(int index) { checkElementIndex(index); return node(index).item; } Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } } ``` 2)迭代器遍歷Iterator 對于RandomAccess類型的集合來說,如ArrayList迭代器遍歷反而因為一些額外的操作,還會增加額外的運行時間; 對于Sequential Access的集合來說,因為Iterator內部維護了當前遍歷的位置,所以每次遍歷,讀取下一個位置并不需要從集合的第一個元素開始查找,只要把指針向后移一位就行了,這樣一來遍歷整個集合的時間復雜度就降低為O(n);以LinkedList的迭代器為例,其內部實現,就是維護當前遍歷的位置,然后操作指針移動就可以了 3)foreach循環遍歷 分析Java字節碼可知,foreach內部實現原理是通過Iterator實現的,只不過這個Iterator是Java編譯器幫我們生成的,所以我們不需要再手動去編寫。但是因為每次都要做類型轉換檢查,所以花費的時間比Iterator略長,而時間復雜度和Iterator是一樣 ### 使用場景 1)傳統的for循環遍歷基于計數器 適用于遍歷順序存儲集合,讀取性能比較高如ArrayList;不適用于遍歷鏈式存儲的集合如LinkedList,時間復雜度太大; 2)迭代器遍歷Iterator 對于順序存儲的數據結構,如果不是太在意時間,推薦選擇此方式,畢竟代碼更加簡潔,也防止了Off-By-One的問題。 鏈式存儲:推薦此種遍歷方式,平均時間復雜度降為O(n) 3)foreach循環遍歷 foreach讓代碼更加簡潔,缺點就是遍歷過程中不能操作數據集合(刪除等),所以有些場合不使用。而且它本身就是基于Iterator實現的,但是由于類型轉換的問題,所以會比直接使用Iterator慢一點,性能上相差不大
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看