Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LinkedList给我深深的上了节for增强的课

LinkedList给我深深的上了节for增强的课

作者头像
IT大咖说
发布于 2020-02-21 10:28:20
发布于 2020-02-21 10:28:20
4490
举报
文章被收录于专栏:IT大咖说IT大咖说

标题既然这么说,就证明它的确坑了我一把。在平时习惯使用了普通的for循环。所以在写遍历的时候也是经常使用这种。然而一味的使用它,给我带来了麻烦。项目开发中,有一个需求是插入多,读少的需求。想着这不是LinkedList的特性吗,就果断的使用了它。然而不久,同事反馈这个业务在读取时,时间特别长。开始想本来LinkedList读就慢嘛,后来一个公司一个大佬看见了我这部分的代码,这个地方慢的另外一个原因是因为我使用了普通的for循环。应该使用for增强形式。

这里小编提一个疑问哈:“java中哪些数据类型可以用于增强for循环”?这是在群里看见的一个面试题,网上没有找到答案,我认为是基本类型和引用类型都可以,还有就是实现了Iterable接口的,比如集合。有知道答案的可以在下面评论下。不胜感激。

步入正题:首先看下在数组中有什么差异

未编译代码,也就是我们程序员写的

使用jad查看反编译代码

jad命令

jad反编译代码

从反编译代码中,可以看出数组中没有什么差别。基本一致。只不过for增强写法上简单明了些。性能上没有什么差别。

在看下在集合中有什么差异

未编译代码集合

jad反编译代码

可以看得出普通for和for增强使用了2种不一样的方式实现,那么那个性能更好呢。

arraylist测试

测试了几次,发现执行时间差不多,并且普通for还比for增强快了些。那在看看LinkedList

LinkedList测试

性能上立马体现出来了。普通for慢很多。看过arraylist和LinkedList源码的肯定知道八九不离十了。我这里就说下结论:需要循环数组结构的数据时,建议使用普通for循环,因为for循环采用下标访问,需要循环链表结构的数据时,一定不要使用普通for循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。

那for增强有没有什么缺点呢,肯定是有的,上面的代码中for增强最终会变成Iterator遍历。Iterator的缺点也就是它的缺点了。如在迭代的过程中,除了使用迭代器(如:Iterator.remove()方法)对集合增删元素外,是不允许直接对集合进行增删操作。否则将会抛出 ConcurrentModificationException异常。

for增强缺点

总结:

  1. 无论是在数组中还是在集合中,加强型for循环都是它们各自的普通for循环的一种“简写方式”,即两者意思上是等价的,但前者方便简单,建议多使用。
  2. for增强不能完全代替普通for循环,因为for增强有一定的局限性。(如数组中不能替换相应索引下的值;集合中不能对集合进行增删操作、也不能获取索引)
  3. for增强只能用于数组、Iterable类型(包括集合)。
  4. 集合中的for增强本质上使用了Ierator迭代器,所以要注意Itrator迭代陷阱。 来源:https://www.toutiao.com/a6770198853497913869/

来都来了,走啥走,留个言呗~

IT大咖说 | 关于版权

由“IT大咖说(ID:itdakashuo)”原创的文章,转载时请注明作者、出处及微信公众号。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT大咖说 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小白学Java:迭代器原来是这么回事
迭代器这个词,在没查找许多资料之前,我只知道个大概,我知道它可以用来遍历集合,但是至于它其中的奥妙,并没有做深究。本篇文章关于Iterator迭代器做了小小的总结,巩固学习,如果有理解错误,或叙述不当之处,还望大家评论区批评指针。
后端码匠
2020/02/14
7840
小白学Java:迭代器原来是这么回事
Java中List集合
ArrayList底层是基于数组实现的,数组是一串连续的存储空间,所以ArrayList集合内部的元素必须是连续存储的,当要在中间删除或者插入一个元素,其后面的元素都需要进行一移动,因此ArrayList集合不适合删除和插入,而适合查找和遍历操作;
訾博ZiBo
2025/01/06
870
什么情况用ArrayList or LinkedList呢?
ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。先对List做一个简单的了解:
会呼吸的Coder
2020/08/19
5600
Java遍历集合的几种方法分析(实现原理、算法性能、适用场合)
Java语言中,提供了一套数据集合框架,其中定义了一些诸如List、Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList。
Java团长
2018/08/07
1.1K0
【Java】ArrayList与LinkedList详解!!!
在数据结构的角度,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删查改以及变量等操作。
喜欢做梦
2024/11/25
1420
【Java】ArrayList与LinkedList详解!!!
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
某大厂的面试现场,一位目光深邃,头顶稀疏的中年面试官坐在椅子上,这时候的我走了进来。
JavaBuild
2024/05/27
860
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
和 lvgo 一起学设计模式(十八)行为型之迭代器模式
这段代码很简单,我们在日常开发中可能也是经常使用到。有的人可能会说了,啊不对,我用的都是
星尘的一个朋友
2020/12/07
4410
和 lvgo 一起学设计模式(十八)行为型之迭代器模式
JAVA入门学习六
描述: 集合的由来数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义太麻烦,java内部给我们提供了集合类能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少;
全栈工程师修炼指南
2020/10/23
6120
JAVA入门学习六
Java SE | 基础语法day14
①是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素。
剑走天涯
2019/08/23
3670
Java SE | 基础语法day14
遍历数据时arraylist效率高于linkedlist_遍历问题种类
一个 java 程序猿比较广为人知的小知识 ,是 ArrayList 和 LinkedList 最好使用迭代器删除,而不是遍历删除。
全栈程序员站长
2022/09/23
7170
遍历数据时arraylist效率高于linkedlist_遍历问题种类
Java ArrayList和LinkedList
​ 集合就是用于存储多个数据的容器。相对于具有相同功能的数组来说,集合的长度可变会更加灵活方便。Java中提供了使用不同数据结构存储数据的不同集合类,他们有各自不同的特点,并且在类中提供了很多常用了方法,便于我们使用。
愷龍
2022/09/26
3410
Java ArrayList和LinkedList
线性表及ArrayList/LinkedList源码分析总结
定义:零个或者多个元素的有限序列。 也就是说它得满足以下几个条件:   ①该序列的数据元素是有限的。   ②如果元素有多个,除了第一个和最后一个元素之外,每个元素只有一个前驱元素和一个后驱元素。   ③第一元素没有前驱元素,最后一个元素没有后继元素。   ④序列中的元素数据类型相同。 则这样的数据结构为线性结构。在复杂的线性表中,一个数据元素(对象)可以由若干个数据项组成,组成一张数据表,类似于数据库。
技术zhai
2019/02/15
6630
16.迭代器模式设计思想
容器的种类有很多种,比如ArrayList、LinkedList、HashSet...
杨充
2024/11/25
1210
java基础学习_集合类01_对象数组、集合Collection接口、集合List接口_day15总结
============================================================================= ============================================================================= 涉及到的知识点有: 1:对象数组的概述和案例(掌握)   (1)对象数组的概述   (2)对象数组的案例 2:集合(Collection接口)(掌握)   (1)集合的由来?   (2)集合和数组的区别?   (3)集合的继承体系结构   (4)Collection接口的概述   (5)Collection接口的成员方法(注意:默认方法前有public abstract修饰)   (6)Collection集合的遍历   (7)迭代器   (8)Collection集合的案例(遍历方式:迭代器方式)(要求:用记事本默写)     A:存储字符串并遍历     B:存储自定义对象并遍历 3:集合(List接口)(掌握)   (1)List是Collection的子接口   (2)List的特有功能(注意:默认方法前有public abstract修饰)   (3)List集合的特有遍历功能   (4)列表迭代器的特有功能(了解)   (5)ConcurrentModificationException 并发修改异常   (6)常见的数据结构以及其优缺点   (7)List的子类特点(面试题)   (8)List集合的案例(遍历方式 迭代器和普通for循环) ============================================================================= ============================================================================= 1:对象数组的概述和案例(掌握) (1)对象数组的概述     数组既可以存储基本数据类型,也可以存储引用类型。它存储引用类型的时候的数组就叫对象数组。 (2)对象数组的案例     我有5个学生,请把这个5个学生的信息存储到数组中,并遍历学生数组,获取得到每一个学生的信息。
黑泽君
2018/10/12
5930
ArrayList、LinkedList 你真的了解吗?
经常在面试时,被问到集合的概念,集合 List、Map、Set 等底层设计以及其使用场景与注意细节。但大部分人的回答都是千篇一律,跟网上的答案一模一样,这是致命滴。其实,大家都错了,尤其是网上,更是误导大家,详细原因,且听我来分析。
程序猿Damon
2020/05/21
4260
JAVA零基础小白学习免费教程day13-Collection&数据结构
JAVASE提供了满足各种需求的API,在使用这些API前,先了解其继承与接口操作架构,才能了解何时采用哪个类,以及类之间如何彼此合作,从而达到灵活应用。
张哥编程
2024/12/13
840
JAVA零基础小白学习免费教程day13-Collection&数据结构
Java集合(四) List的实现类
分类 ArrayList(重点) Vector LinkedList 1,ArrayList 数组结构实现,所有必须连续空间存储,查询快,增删慢。 JDK1.2之后加入,运行效率快,线程不安全 2,Vector 数组结构实现,所有必须连续空间存储,查询快,增删慢。 JDK1.2之后加入,运行效率慢,线程安全 (ArrayList和Vector最大的区别在于线程安不安全和运行效率) 3,LinkedList 双向链表结构实现,增删快,查询慢。 ArrayList List list = new ArrayLi
宇宙无敌暴龙战士之心悦大王
2022/01/10
3750
对于Java循环中的For和For-each,哪个更快
Java遍历集合有两种方法。一个是最基本的for循环,另一个是jdk5引入的for each。通过这种方法,我们可以更方便地遍历数组和集合。但是你有没有想过这两种方法?哪一个遍历集合更有效?
愷龍
2022/08/25
1.2K0
对于Java循环中的For和For-each,哪个更快
LinkedList源码解析
LinkedList是一个实现了List接口和Deque接口的双端链表。LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性; LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以调用静态类Collections类中的synchronizedList方法:
黑洞代码
2021/01/28
9370
LinkedList源码解析
Java数据结构与算法解析(一)——表
本节我们讨论常见常用的数据结构——表。 如果要通俗简单的说什么是表,那我们可以这样说:按顺序排好的元素集合就是表。
老马的编程之旅
2022/06/22
3290
Java数据结构与算法解析(一)——表
相关推荐
小白学Java:迭代器原来是这么回事
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档