您现在的位置是:亿华云 > IT科技
对于Java中的For循环和Foreach,哪个更快
亿华云2025-10-03 12:19:21【IT科技】8人已围观
简介Java遍历集合有两种方法。一个是最基本的for循环,另一个是jdk5引入的for each。通过这种方法,我们可以更方便地遍历数组和集合。但是你有没有想过这两种方法?哪一个遍历集合更有效?for-
Java遍历集合有两种方法。哪个更快一个是对于最基本的for循环,另一个是环和jdk5引入的for each。通过这种方法,哪个更快我们可以更方便地遍历数组和集合。对于但是环和你有没有想过这两种方法?哪一个遍历集合更有效?
for-each实现方法For-each不是一种新语法,而是哪个更快Java的语法糖。在编译时,对于编译器将此代码转换为迭代器实现,环和并将其编译为字节码。哪个更快
语法糖:
语法糖(Syntactic sugar),对于也译为糖衣语法,环和是哪个更快由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的对于某种语法,这种语法对语言的环和功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的高防服务器机会。
我们可以通过执行命令javap-verbose-Testforeach反编译以下编译代码:
public class TestForeach {
List
public void testForeach(){
for(Integer i : integers){
}
}
}获得的详细字节码如下:
public void testForeach();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=3, args_size=1
0: aload_0
1: getfield #2 // Field integers:Ljava/util/List;
4: invokeinterface #3, 1 // InterfaceMethod java/util/List.iterator:()Ljava/util/Iterator;
9: astore_1
10: aload_1
11: invokeinterface #4, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z
16: ifeq 32
19: aload_1
20: invokeinterface #5, 1 // InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
25: checkcast #6 // class java/lang/Integer
28: astore_2
29: goto 10
32: return
LineNumberTable:
line 11: 0
line 13: 29
line 14: 32
LocalVariableTable:
Start Length Slot Name Signature
29 0 2 i Ljava/lang/Integer;
0 33 0 this Ltest/TestForeach;
}此字节码的一般含义是使用getfileld命令来获取integers变量并且调用List.iterator来获取迭代器实例和调用iterator.hasNext。如果返回true,调用iterator.next方法。
请看,这是迭代器遍历集合的实现逻辑。
基准测试现在让我们使用for循环方法和for-each方法进行测试。
public class ForLoopTest {
public static void main(String[] args) {
List
for (int i = 0; i < 10000000; i++) {
arrayList.add(i);
}
long arrayListStartTime = System.currentTimeMillis();
for (int i = 0; i < arrayList.size(); i++) {
arrayList.get(i);
}
long arrayListCost =System.currentTimeMillis()-arrayListStartTime;
System.out.println("ArrayList for loop traversal cost: "+ arrayListCost);
long arrayListForeachStartTime = System.currentTimeMillis();
for (Integer integer : arrayList) {
}
long arrayListForeachCost =System.currentTimeMillis()-arrayListForeachStartTime;
System.out.println("ArrayList foreach traversal cost: "+ arrayListForeachCost);这是测试结果:
如你所见,结果是显而易见的。对于ArrayList,使用For循环方法的性能优于For each方法。
我们可以说for循环比for-each好吗?
答案是否定的。在下一个基准测试中,我们将ArrayList更改为LinkedList。 同样,这里是测试结果。
一些初学者可能想知道为什么ArrayList使用for循环方法遍历得更快,而LinkedList则更慢,速度也非常慢?
这由ArrayList和LinkedList数据结构决定。云南idc服务商 ArrayList底层使用数组存储元素。数组是连续的内存空间。数据可以通过索引获得。时间复杂度为O(1),因此速度很快。
LinkedList的底层是一个双向链表。使用for循环实现遍历,每次都需要从链表的头节点开始。时间复杂度为O(n*n)。
结论使用ArrayList时,for循环方法更快,因为for-each由迭代器实现,并且需要执行并发修改验证。使用LinkedList时,for-each比for循环快得多,因为LinkedList是通过使用双向链表实现的。每个寻址都需要从头节点开始。如果我们需要遍历LinkedList,我们需要避免使用for循环。使用迭代器模式,for-each不需要关心集合的具体实现。如果需要替换集合,无需修改代码即可轻松替换。网站模板很赞哦!(641)
上一篇: 数据中心的停机时间怎么会成为企业的噩梦?
下一篇: 提高数据中心温度,减少排放
相关文章
- 400G和800G相干光传输标准最新进展
- 域后缀首选.com,.net,然后是.cn。后缀选择不当,导致流量损失。域名是企业与互联网网址之间的链接,关键是企业在网络上存在的标志。因此,选择好域名是开展网上工作的首要重要条件。
- 为什么现在中文域名觉得好?使用中文域名有什么好处?
- 以上的就是为大家介绍的关于域名的详解
- IT基础设施必须提供性能与效率
- .com域名是国际最广泛流行的通用域名,目前全球注册量第一的域名,公司企业注册域名的首选。国际化公司通常会注册该类域名。
- 3、商标域名一经注册,就可以作为域名裁决过程中的主要信息之一。这可以大大增加公司被抢注的相关域名胜诉的机会。
- 其次,一般域名注册有一个获取密码的按钮,域名注册商点击后会向您发送密码。在得到域名注册商发送的密码后,将其传输到域名服务提供商网站,然后输入密码,此时域名呈现申请状态。提交申请后,原注册人通常会向您发送一封电子邮件,询问您是否同意转让。此时,您只需点击同意转移按钮,域名注册商就可以成功转移。
- Nginx 反向代理为什么叫做“反向”?
- 4、待所有域名查询结束后可在右侧点击导出结果,即可以excel的文件方式将查询到的结果导出。
热门文章
站长推荐
清华开发超高速光电计算芯片,算力3000倍于高性能商用芯片
域名不仅仅是一个简单的网站。对于有长远眼光的公司来说,在运营网站之前确定一个优秀的域名对有长远眼光的公司来说是非常重要的。这对今后的市场营销、产品营销和企业品牌建设都具有十分重要的意义。优秀的域名是企业在市场竞争中获得持久优势的利器。
互联网中的地址是数字的IP地址,域名解析的作用主要就是为了便于记忆。
前面这两个步骤都是在本机完成的。到这里还没有涉及真正的域名解析服务器,如果在本机中仍然无法完成域名的解析,就会真正请求域名服务器来解析这个域名了。
2023年中国模拟芯片行业市场规模及未来发展趋势预测分析
2. 不要花大价钱买域名,新手鉴别能力不足,容易投资失误。
要如何了解反向解析和域名解析?新手该怎么去操作?
6、提示添加成功,点击确认进行最后的确定操作。一般10分钟就解析生效,可以用域名进行访问了。