您的位置:首页 > 汽车 > 时评 > 公司的网站推广怎么做_关键词搜索优化_词爱站的关键词_中国数据网

公司的网站推广怎么做_关键词搜索优化_词爱站的关键词_中国数据网

2025/1/4 6:58:19 来源:https://blog.csdn.net/t1750982356/article/details/144301558  浏览:    关键词:公司的网站推广怎么做_关键词搜索优化_词爱站的关键词_中国数据网
公司的网站推广怎么做_关键词搜索优化_词爱站的关键词_中国数据网

目录

    • foreach的特点
      • 遍历时
      • 删除时
    • foreach 和 for循环遍历数组的差别
    • 关于 `foreach` 和 `for` 循环的效率问题

首先我们要对foreach有个基本的了解,才能对它们进行区别
在这里插入图片描述

foreach的特点

遍历时

foreach循环去遍历一个数组

foreach循环去遍历一个集合

然后运行代码,按顺序把里面的元素都打印出来了(就是普通的遍历嘛打印嘛,很平常)。

咱们去看编译后的代码,这时候就发现有意思的事儿了。

对于数组的那个foreach循环呀,编译器悄悄给它变成了普通的for循环,就是那种按索引一个一个去访问数组里元素的循环,这样来实现把数组元素都打印出来的操作。

而对于那个集合foreach循环呢,编译后发现它是靠集合自带的迭代器来实现的,通过迭代器去判断有没有下一个元素,有的话就取出来然后打印,一直这么循环,直到把集合里的元素都打印完。

总结:

在 Java 里用foreach循环去处理数组集合的时候,虽然咱写代码的时候看着都差不多,挺简单方便的,但实际上它底层干活的方式不一样,一个是变成普通for循环用索引访问,一个是靠迭代器来访问元素。

删除时

先搞个列表,里面有 "111""222""333",打算用 foreach 循环删掉 "222"

	  ArrayList<String> list = new ArrayList<>();list.add("111");list.add("222");list.add("333");for (String i : list) {list.remove("222");}

在这里插入图片描述

为啥会报错呢?

foreach 循环在背后工作的时候呢,它是靠一个叫迭代器的东西来一个一个拿列表里的元素的。这个迭代器有个小 “账本”,它记着列表一开始的一个状态(就是 modcount 这个东西),每次循环它都要拿这个记着的状态和列表实际现在的状态(也就是 modCount 这个成员变量)对比一下,看看对不对得上。

但你在 foreach 循环里直接用列表的 remove 方法去删元素的时候,列表自己的那个状态就变了(modcount 就增加了),可迭代器记着的那个状态没跟着变呀,这下两边对不上了,迭代器就懵了,觉得出问题了,然后就报错了,根本没法接着往下删元素了。

可以使用迭代器的 remove 方法来删除元素

		ArrayList<String> list = new ArrayList<>();list.add("111");list.add("222");list.add("333");Iterator<String> it = list.iterator();//使用迭代器的remove方法来删除元素while (it.hasNext()){String next = it.next();if(next.equals("222")){it.remove();}}

还是先创建那个有 "111""222""333" 的列表,不过这次呢,先从列表那儿拿到它的迭代器。

然后用一个 while 循环,只要迭代器说还有元素没拿完(就是 hasNext 方法返回 true),就去拿下一个元素看看。要是拿出来的这个元素正好是要删的 "222",那就用迭代器自己带的 remove 方法去删这个元素。

为啥这样就行呢?因为这个迭代器自己的 remove 方法,它在删元素的时候,会把自己记着的那个状态(modcount 相关的东西)也跟着更新好,这样两边状态就一直能对得上了,就能顺顺利利地把元素删掉了,最后列表也就变成 [111, 333] 了。

foreach 和 for循环遍历数组的差别

  • 遍历方式的差别
    • for 循环遍历数组的时候,其实是靠着一个个去数数组的下标(即索引)。比如说,先找到第 0 个下标,然后通过这个下标去找到对应的数组元素,接着再找第 1 个下标、第 2 个下标…… 这样依次来访问数组里所有的元素。
    • foreach 循环呢,它是靠 Iterator(迭代器)来实现的。就好像顺着一条线,每次去找到下一个元素待的地方(也就是元素的地址),然后直接就能拿到那个元素,这样一个一个地把数组元素都访问一遍。
  • 删除元素方面的差别
    • for 循环因为是按索引来操作的,所以要是想删掉某个元素,直接就能把那个元素删掉,不过这时候只是元素的值没了,但它原来占的那个地址还在那,后面的元素就可以往前挪,把这个空出来的位置填上,就好像后面的元素把前面删掉元素的位置给占了,这样就实现了删除的效果。
    • foreach 循环就不一样啦,它是顺着元素地址去访问的,要是直接在它的循环里想删掉某个元素可不行。得用迭代器里面专门的 remove 方法才能删掉元素,这个方法是把元素所在的地址直接给清理掉了。但要是在 foreach 循环里用了这个方法删掉元素,循环里面用来代表元素的那个变量的值就变了,这样就可能出问题了,再接着循环的话,程序就觉得不安全了,就会报错。所以一般来说,别在 foreach 循环里直接删元素,真要删元素的话,用 for 循环更靠谱。

关于 foreachfor 循环的效率问题

  • 循环数组时

    • 如果是要循环访问数组里的元素,用普通的 for 循环更好。因为数组在计算机里存的时候,用下标去访问它是最方便、最快的,就像去图书馆找书,知道书架号(下标)一下子就能找到那本书(元素)一样,所以这时候 for 循环效率挺不错的,而且和 foreach 循环比起来,效率也差不了多少,for`循环还方便删元素,所以循环数组就可以优先考虑用它。
  • 循环链表结构的数据(集合)时

    • 要是面对的是像链表这种结构的数据(比如说集合),那就要慎用普通 for 循环了。因为链表的元素在内存里可不是像数组那样按顺序排好的,用下标去访问它可太难了,要是数据量特别大的时候,这么干可能就把整个系统给弄崩溃了,就像在一团乱麻里非要按固定顺序找东西,越找越乱套一样。这时候用 foreach 循环就好一些,它靠迭代器顺着链表的结构一个一个找元素,效率相对来说会高一点

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com