您现在的位置是:主页 > news > 长春网站建设网站制作推广/河南郑州最新消息

长春网站建设网站制作推广/河南郑州最新消息

admin2025/5/13 0:58:49news

简介长春网站建设网站制作推广,河南郑州最新消息,页面访问升级老域名,品牌营销是什么ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。 看过ArrayList 源码的同学有没有注意过有这…

长春网站建设网站制作推广,河南郑州最新消息,页面访问升级老域名,品牌营销是什么ArrayList简介 ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。 看过ArrayList 源码的同学有没有注意过有这…

ArrayList简介

  • ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。
    看过ArrayList 源码的同学有没有注意过有这么一个细节:为什么ArrayList实现了RandomAccess这个接口,但是 LinkedList却没有实现这个接口?这是一个空接口,里面没有任何的方法,有什么作用呢?
    答案: RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持快速随机访问的。也就是说,实现了这个接口的集合是支持 快速随机访问 策略的。而LinkedList是不能实现随机访问的。

ArrayList数据结构

ArrayList包含了两个重要的对象:elementData 和 size。

  • elementData 是"Object[]类型的数组",它保存了添加到ArrayList中的元素。实际上,elementData是个动态数组
    那是不是有人就会问既然ArrayList本质是数组,那为啥它的长度可以改变?
    首先,数组的确长度不能改变。不过,ArrayList内部有一系列骚操作,大概就是它每次觉得长度不够就会 创建一个新数组,这个新数组的容量比原来多出50%,把原来的数组copy过来,然后把以前的数组销毁掉。
  • size 则是动态数组的实际大小。

ArrayList遍历方式

  • 第1种,普通for循环随机访问,通过索引值去遍历。
<span style="color:#1c1f21"><code class="language-java">     <span style="color:#708090">// 随机访问</span>List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list <span style="color:#000000">=</span> <span style="color:#000000">new</span> ArrayList<span style="color:#000000"><</span><span style="color:#000000">></span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">int</span> size <span style="color:#000000">=</span> list<span style="color:#000000">.</span><span style="color:#f92672">size</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">for</span> <span style="color:#000000">(</span><span style="color:#000000">int</span> i <span style="color:#000000">=</span> <span style="color:#000000">0</span><span style="color:#000000">;</span> i <span style="color:#000000"><</span> size<span style="color:#000000">;</span> i<span style="color:#000000">++</span><span style="color:#000000">)</span> <span style="color:#000000">{</span>value <span style="color:#000000">=</span> list<span style="color:#000000">.</span><span style="color:#f92672">get</span><span style="color:#000000">(</span>i<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span>
</code></span>
  • 第2种,通过迭代器遍历。即通过Iterator去遍历。
<span style="color:#1c1f21"><code class="language-java">     <span style="color:#708090">// 迭代器遍历</span>Iterator<span style="color:#000000"><</span>String<span style="color:#000000">></span> iter <span style="color:#000000">=</span> list<span style="color:#000000">.</span><span style="color:#f92672">iterator</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">while</span> <span style="color:#000000">(</span>iter<span style="color:#000000">.</span><span style="color:#f92672">hasNext</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">)</span> <span style="color:#000000">{</span>value <span style="color:#000000">=</span> iter<span style="color:#000000">.</span><span style="color:#f92672">next</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span>
</code></span>
  • 第3种,增强for循环遍历。
<span style="color:#1c1f21"><code class="language-java">    <span style="color:#708090">// 增强for循环</span><span style="color:#000000">for</span> <span style="color:#000000">(</span>String s <span style="color:#000000">:</span> list<span style="color:#000000">)</span> <span style="color:#000000">{</span>value <span style="color:#000000">=</span> s<span style="color:#000000">;</span><span style="color:#000000">}</span>
</code></span>
  • 第4种 forEach + lambda 循环遍历
<span style="color:#1c1f21"><code class="language-java">     list<span style="color:#000000">.</span><span style="color:#f92672">forEach</span><span style="color:#000000">(</span>p <span style="color:#000000">-</span><span style="color:#000000">></span> <span style="color:#000000">{</span>p<span style="color:#000000">.</span><span style="color:#f92672">hashCode</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span><span style="color:#000000">)</span><span style="color:#000000">;</span>
</code></span>

既然有4种遍历,那我们看看哪种遍历效率下面我们通过一个实验来看下这四种循环的耗时吧:
测试代码

<span style="color:#1c1f21"><code class="language-java"><span style="color:#708090">/*** @Date: 2020/4/23 * @Description:*/</span>
<span style="color:#000000">public</span> <span style="color:#000000">class</span> ArrayListTest <span style="color:#000000">{</span><span style="color:#000000">public</span> <span style="color:#000000">static</span> <span style="color:#000000">void</span> <span style="color:#f92672">main</span><span style="color:#000000">(</span>String<span style="color:#000000">[</span><span style="color:#000000">]</span> args<span style="color:#000000">)</span> <span style="color:#000000">{</span><span style="color:#708090">// 数据预热</span><span style="color:#708090">/* List<String> testList = createTestList(10);testForEach(testList);testFor(testList);testRandFor(10,testList);*/</span>List<span style="color:#000000"><</span>Integer<span style="color:#000000">></span> integers <span style="color:#000000">=</span> Arrays<span style="color:#000000">.</span><span style="color:#f92672">asList</span><span style="color:#000000">(</span><span style="color:#000000">10</span><span style="color:#000000">,</span> <span style="color:#000000">50</span><span style="color:#000000">,</span> <span style="color:#000000">100</span><span style="color:#000000">,</span><span style="color:#000000">500</span><span style="color:#000000">,</span><span style="color:#000000">1000</span><span style="color:#000000">,</span> <span style="color:#000000">10000</span><span style="color:#000000">,</span> <span style="color:#000000">50000</span><span style="color:#000000">,</span> <span style="color:#000000">100000</span><span style="color:#000000">,</span> <span style="color:#000000">5000000</span><span style="color:#000000">,</span> <span style="color:#000000">10000000</span><span style="color:#000000">,</span><span style="color:#000000">30000000</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">for</span> <span style="color:#000000">(</span>Integer i <span style="color:#000000">:</span> integers<span style="color:#000000">)</span> <span style="color:#000000">{</span><span style="color:#f92672">testRand</span><span style="color:#000000">(</span>i<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span><span style="color:#000000">}</span><span style="color:#000000">private</span> <span style="color:#000000">static</span> <span style="color:#000000">void</span> <span style="color:#f92672">testRand</span><span style="color:#000000">(</span><span style="color:#000000">int</span> size<span style="color:#000000">)</span> <span style="color:#000000">{</span>System<span style="color:#000000">.</span>out<span style="color:#000000">.</span><span style="color:#f92672">println</span><span style="color:#000000">(</span><span style="color:#000000">"-----------次数:"</span> <span style="color:#000000">+</span> size <span style="color:#000000">+</span> <span style="color:#000000">"------------"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list <span style="color:#000000">=</span> <span style="color:#f92672">createTestList</span><span style="color:#000000">(</span>size<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#708090">// 随机访问通过索引值去遍历。</span><span style="color:#000000">long</span> time1 <span style="color:#000000">=</span> System<span style="color:#000000">.</span><span style="color:#f92672">nanoTime</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#f92672">testRandFor</span><span style="color:#000000">(</span>size<span style="color:#000000">,</span> list<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">long</span> time2 <span style="color:#000000">=</span> System<span style="color:#000000">.</span><span style="color:#f92672">nanoTime</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#708090">// 增强for循环</span><span style="color:#f92672">testFor</span><span style="color:#000000">(</span>list<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">long</span> time3 <span style="color:#000000">=</span> System<span style="color:#000000">.</span><span style="color:#f92672">nanoTime</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#708090">// 迭代器遍历</span><span style="color:#f92672">testIterator</span><span style="color:#000000">(</span>list<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">long</span> time4 <span style="color:#000000">=</span> System<span style="color:#000000">.</span><span style="color:#f92672">nanoTime</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#708090">// forEach + lambda</span><span style="color:#f92672">testForEach</span><span style="color:#000000">(</span>list<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">long</span> time5 <span style="color:#000000">=</span> System<span style="color:#000000">.</span><span style="color:#f92672">nanoTime</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span>System<span style="color:#000000">.</span>out<span style="color:#000000">.</span><span style="color:#f92672">println</span><span style="color:#000000">(</span><span style="color:#000000">"随机访问\t\t"</span> <span style="color:#000000">+</span> <span style="color:#000000">(</span>time2 <span style="color:#000000">-</span> time1<span style="color:#000000">)</span> <span style="color:#000000">/</span> <span style="color:#000000">1000</span> <span style="color:#000000">+</span> <span style="color:#000000">" ms"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>System<span style="color:#000000">.</span>out<span style="color:#000000">.</span><span style="color:#f92672">println</span><span style="color:#000000">(</span><span style="color:#000000">"增强for遍历\t\t"</span> <span style="color:#000000">+</span> <span style="color:#000000">(</span>time3 <span style="color:#000000">-</span> time2<span style="color:#000000">)</span> <span style="color:#000000">/</span> <span style="color:#000000">1000</span> <span style="color:#000000">+</span> <span style="color:#000000">" ms"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>System<span style="color:#000000">.</span>out<span style="color:#000000">.</span><span style="color:#f92672">println</span><span style="color:#000000">(</span><span style="color:#000000">"迭代器遍历\t\t"</span> <span style="color:#000000">+</span> <span style="color:#000000">(</span>time4 <span style="color:#000000">-</span> time3<span style="color:#000000">)</span> <span style="color:#000000">/</span> <span style="color:#000000">1000</span> <span style="color:#000000">+</span> <span style="color:#000000">" ms"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>System<span style="color:#000000">.</span>out<span style="color:#000000">.</span><span style="color:#f92672">println</span><span style="color:#000000">(</span><span style="color:#000000">"forEach遍历\t\t"</span> <span style="color:#000000">+</span> <span style="color:#000000">(</span>time5 <span style="color:#000000">-</span> time4<span style="color:#000000">)</span> <span style="color:#000000">/</span> <span style="color:#000000">1000</span> <span style="color:#000000">+</span> <span style="color:#000000">" ms"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>System<span style="color:#000000">.</span>out<span style="color:#000000">.</span><span style="color:#f92672">println</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span><span style="color:#000000">private</span> <span style="color:#000000">static</span> <span style="color:#000000">void</span> <span style="color:#f92672">testRandFor</span><span style="color:#000000">(</span><span style="color:#000000">int</span> size<span style="color:#000000">,</span> List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list<span style="color:#000000">)</span> <span style="color:#000000">{</span><span style="color:#000000">for</span> <span style="color:#000000">(</span><span style="color:#000000">int</span> i <span style="color:#000000">=</span> <span style="color:#000000">0</span><span style="color:#000000">;</span> i <span style="color:#000000"><</span> size<span style="color:#000000">;</span> i<span style="color:#000000">++</span><span style="color:#000000">)</span> <span style="color:#000000">{</span>list<span style="color:#000000">.</span><span style="color:#f92672">get</span><span style="color:#000000">(</span>i<span style="color:#000000">)</span><span style="color:#000000">.</span><span style="color:#f92672">hashCode</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span><span style="color:#000000">}</span><span style="color:#000000">private</span> <span style="color:#000000">static</span> <span style="color:#000000">void</span> <span style="color:#f92672">testFor</span><span style="color:#000000">(</span>List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list<span style="color:#000000">)</span> <span style="color:#000000">{</span><span style="color:#000000">for</span> <span style="color:#000000">(</span>String s <span style="color:#000000">:</span> list<span style="color:#000000">)</span> <span style="color:#000000">{</span>s<span style="color:#000000">.</span><span style="color:#f92672">hashCode</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span><span style="color:#000000">}</span><span style="color:#000000">private</span> <span style="color:#000000">static</span> <span style="color:#000000">void</span> <span style="color:#f92672">testIterator</span><span style="color:#000000">(</span>List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list<span style="color:#000000">)</span> <span style="color:#000000">{</span>Iterator<span style="color:#000000"><</span>String<span style="color:#000000">></span> iter <span style="color:#000000">=</span> list<span style="color:#000000">.</span><span style="color:#f92672">iterator</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">while</span> <span style="color:#000000">(</span>iter<span style="color:#000000">.</span><span style="color:#f92672">hasNext</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">)</span> <span style="color:#000000">{</span>iter<span style="color:#000000">.</span><span style="color:#f92672">next</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">.</span><span style="color:#f92672">hashCode</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span><span style="color:#000000">}</span><span style="color:#000000">private</span> <span style="color:#000000">static</span> <span style="color:#000000">void</span> <span style="color:#f92672">testForEach</span><span style="color:#000000">(</span>List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list<span style="color:#000000">)</span> <span style="color:#000000">{</span>list<span style="color:#000000">.</span><span style="color:#f92672">forEach</span><span style="color:#000000">(</span>p <span style="color:#000000">-</span><span style="color:#000000">></span> <span style="color:#000000">{</span>p<span style="color:#000000">.</span><span style="color:#f92672">hashCode</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span><span style="color:#000000">public</span> <span style="color:#000000">static</span> List<span style="color:#000000"><</span>String<span style="color:#000000">></span> <span style="color:#f92672">createTestList</span><span style="color:#000000">(</span><span style="color:#000000">int</span> size<span style="color:#000000">)</span> <span style="color:#000000">{</span>List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list <span style="color:#000000">=</span> <span style="color:#000000">new</span> ArrayList<span style="color:#000000"><</span><span style="color:#000000">></span><span style="color:#000000">(</span>size<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">for</span> <span style="color:#000000">(</span><span style="color:#000000">int</span> i <span style="color:#000000">=</span> <span style="color:#000000">0</span><span style="color:#000000">;</span> i <span style="color:#000000"><</span> size<span style="color:#000000">;</span> i<span style="color:#000000">++</span><span style="color:#000000">)</span> <span style="color:#000000">{</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span>UUID<span style="color:#000000">.</span><span style="color:#f92672">randomUUID</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">.</span><span style="color:#f92672">toString</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span><span style="color:#000000">return</span> list<span style="color:#000000">;</span><span style="color:#000000">}</span>
<span style="color:#000000">}</span></code></span>

测试数据结果如下:

<span style="color:#1c1f21"><code class="language-java"><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">10</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">8</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">5</span> ms
迭代器遍历		<span style="color:#000000">2</span> ms
forEach遍历		<span style="color:#000000">40358</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">50</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">4</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">8</span> ms
迭代器遍历		<span style="color:#000000">7</span> ms
forEach遍历		<span style="color:#000000">5</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">100</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">13</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">18</span> ms
迭代器遍历		<span style="color:#000000">14</span> ms
forEach遍历		<span style="color:#000000">10</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">500</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">54</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">28</span> ms
迭代器遍历		<span style="color:#000000">24</span> ms
forEach遍历		<span style="color:#000000">57</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">1000</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">106</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">56</span> ms
迭代器遍历		<span style="color:#000000">50</span> ms
forEach遍历		<span style="color:#000000">37</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">10000</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">1192</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">892</span> ms
迭代器遍历		<span style="color:#000000">861</span> ms
forEach遍历		<span style="color:#000000">594</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">50000</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">3651</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">2908</span> ms
迭代器遍历		<span style="color:#000000">2563</span> ms
forEach遍历		<span style="color:#000000">2712</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">100000</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">10693</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">5273</span> ms
迭代器遍历		<span style="color:#000000">9294</span> ms
forEach遍历		<span style="color:#000000">3638</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">5000000</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">238922</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">29914</span> ms
迭代器遍历		<span style="color:#000000">30533</span> ms
forEach遍历		<span style="color:#000000">28016</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">10000000</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">431047</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">47151</span> ms
迭代器遍历		<span style="color:#000000">46371</span> ms
forEach遍历		<span style="color:#000000">38943</span> ms<span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">-</span>次数<span style="color:#000000">:</span><span style="color:#000000">30000000</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span><span style="color:#000000">--</span>
随机访问		<span style="color:#000000">1163935</span> ms
增强<span style="color:#000000">for</span>遍历		<span style="color:#000000">137710</span> ms
迭代器遍历		<span style="color:#000000">139211</span> ms
forEach遍历		<span style="color:#000000">129960</span> ms
</code></span>
  • 结论:如果数据量比较少的话貌似四种循环耗时都差不多,但是随着数据量的增长会发现foreach的效率是最好的。
    但是从上面我们会发现一个奇怪的现象,第一次循环的时候forEach遍历的时间是最长的尽管数据量非常少也会这样。但是后面的耗时就正常了。如果放开测试里面的预热代码,每次跑出来的耗时也是正常的。
  • 这个结论貌似和网上的一些结论有点误差:如果你在百度上搜索java for foreach java8 等关键词会出现很多的搜索结果,比如这几个循环效率的对比。并且很多博主的结论是java8的foreach循环是真的菜,效率不是差的一点点!!!慎用,之类的。
    若java8的foreach效率如此低下,为何还要推出?难道jdk的开发人员不会优化一下?带着这个思考,我仔细看了“已往之不谏”的博主最后为java8 正名的博客,写的不错,测试也很充分(说实话,没有仔细的阅读)但是结论很明显。java8胜了。作者为了证明java8不是吃素的,确实下了不少功夫。

ArrayList删除数据

虽然有四种遍历方式,但是能够正确删除数据的方式只有两种

  • 第1种通过迭代器进行删除。这种方式的话,也是《阿里代码规约》所推荐的。
    在这里插入图片描述
<span style="color:#1c1f21"><code class="language-java"> Iterator<span style="color:#000000"><</span>String<span style="color:#000000">></span> iter <span style="color:#000000">=</span> list<span style="color:#000000">.</span><span style="color:#f92672">iterator</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">while</span> <span style="color:#000000">(</span>iter<span style="color:#000000">.</span><span style="color:#f92672">hasNext</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">)</span> <span style="color:#000000">{</span>iter<span style="color:#000000">.</span><span style="color:#f92672">next</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">.</span><span style="color:#f92672">hashCode</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span>iter<span style="color:#000000">.</span><span style="color:#f92672">remove</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span>
</code></span>
  • 第2种倒序循环删除
<span style="color:#1c1f21"><code class="language-java">  <span style="color:#000000">for</span><span style="color:#000000">(</span><span style="color:#000000">int</span> i <span style="color:#000000">=</span> list<span style="color:#000000">.</span><span style="color:#f92672">size</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">-</span><span style="color:#000000">1</span><span style="color:#000000">;</span>i<span style="color:#000000">>=</span><span style="color:#000000">0</span><span style="color:#000000">;</span>i<span style="color:#000000">--</span><span style="color:#000000">)</span><span style="color:#000000">{</span>list<span style="color:#000000">.</span><span style="color:#f92672">remove</span><span style="color:#000000">(</span>i<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span>
</code></span>

下面再演示下错误的删除操作

  • 普通for循环正序删除,删除过程中元素向左移动,不能删除重复的元素
<span style="color:#1c1f21"><code class="language-java">        List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list <span style="color:#000000">=</span> <span style="color:#000000">new</span> ArrayList<span style="color:#000000"><</span><span style="color:#000000">></span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"1"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"1"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"2"</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">for</span><span style="color:#000000">(</span><span style="color:#000000">int</span> i<span style="color:#000000">=</span><span style="color:#000000">0</span><span style="color:#000000">;</span>i<span style="color:#000000"><</span>list<span style="color:#000000">.</span><span style="color:#f92672">size</span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span>i<span style="color:#000000">++</span><span style="color:#000000">)</span><span style="color:#000000">{</span>list<span style="color:#000000">.</span><span style="color:#f92672">remove</span><span style="color:#000000">(</span>i<span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#000000">}</span>System<span style="color:#000000">.</span>out<span style="color:#000000">.</span><span style="color:#f92672">println</span><span style="color:#000000">(</span>String<span style="color:#000000">.</span><span style="color:#f92672">join</span><span style="color:#000000">(</span><span style="color:#000000">","</span><span style="color:#000000">,</span>list<span style="color:#000000">)</span><span style="color:#000000">)</span><span style="color:#000000">;</span>
</code></span>

结果输出:1

  • 增强for循环删除会抛出 java.util.ConcurrentModificationException

ArryList注意点

  • 谨慎使用ArrayList中的subList方法
    • ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException 异常,即 java.util.RandomAccessSubList cannot be cast to java.util.ArrayList. 说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。
      <span style="color:#1c1f21"><code class="language-java">    List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list <span style="color:#000000">=</span> <span style="color:#000000">new</span> ArrayList<span style="color:#000000"><</span><span style="color:#000000">></span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"1"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"1"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"2"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>ArrayList<span style="color:#000000"><</span>String<span style="color:#000000">></span> strings <span style="color:#000000">=</span>  <span style="color:#000000">(</span>ArrayList<span style="color:#000000">)</span>list<span style="color:#000000">.</span><span style="color:#f92672">subList</span><span style="color:#000000">(</span><span style="color:#000000">0</span><span style="color:#000000">,</span> <span style="color:#000000">1</span><span style="color:#000000">)</span><span style="color:#000000">;</span>运行结果:
      Exception in thread <span style="color:#000000">"main"</span> java<span style="color:#000000">.</span>lang<span style="color:#000000">.</span>ClassCastException<span style="color:#000000">:</span> java<span style="color:#000000">.</span>util<span style="color:#000000">.</span>ArrayList$SubList cannot be cast to java<span style="color:#000000">.</span>util<span style="color:#000000">.</span>ArrayList
      at com<span style="color:#000000">.</span>workit<span style="color:#000000">.</span>demo<span style="color:#000000">.</span>listener<span style="color:#000000">.</span>ArrayListTest<span style="color:#000000">.</span><span style="color:#f92672">main</span><span style="color:#000000">(</span>ArrayListTest<span style="color:#000000">.</span>java<span style="color:#000000">:</span><span style="color:#000000">29</span><span style="color:#000000">)</span>
      </code></span>
    • 在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、 删除均会产ConcurrentModificationException 异常。
<span style="color:#1c1f21"><code class="language-java">   List<span style="color:#000000"><</span>String<span style="color:#000000">></span> list <span style="color:#000000">=</span> <span style="color:#000000">new</span> ArrayList<span style="color:#000000"><</span><span style="color:#000000">></span><span style="color:#000000">(</span><span style="color:#000000">)</span><span style="color:#000000">;</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"1"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"1"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"2"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>List<span style="color:#000000"><</span>String<span style="color:#000000">></span> subList <span style="color:#000000">=</span>  list<span style="color:#000000">.</span><span style="color:#f92672">subList</span><span style="color:#000000">(</span><span style="color:#000000">0</span><span style="color:#000000">,</span> <span style="color:#000000">1</span><span style="color:#000000">)</span><span style="color:#000000">;</span><span style="color:#708090">// 对原List增加一个值</span>list<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"10"</span><span style="color:#000000">)</span><span style="color:#000000">;</span>subList<span style="color:#000000">.</span><span style="color:#f92672">add</span><span style="color:#000000">(</span><span style="color:#000000">"11"</span><span style="color:#000000">)</span><span style="color:#000000">;</span> <span style="color:#708090">// 这一行会报 java.util.ConcurrentModificationException</span></code></span>
  • 初始化List的时候尽量指定它的容量大小。(尽量减少扩容次数)

结束

为帮助开发者们提升面试技能、有机会入职BATJ等大厂公司,特别制作了这个专辑——这一次整体放出。

大致内容包括了: Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大厂面试题等、等技术栈! 

需要获取以下这些面试题答案以及学习资料得话麻烦一键三连之后微信扫描下图作者助手的微信:( wjn168178 )添加即可免费获取到哦

å¨è¿éæå¥å¾çæè¿°

看完三件事❤️

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  1. 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。

  2. 关注公众号 『 java烂猪皮 』,不定期分享原创知识。

  3. 同时可以期待后续文章ing🚀

  4. .关注后回复【666】扫码即可获取学习资料包

作者:java金融
链接:https://www.imooc.com/article/306136