java foreach6_Java foreach循环是否会创建一个新对象?
for-each循环没有神奇的对象构造.这个语法:
for(Object o : Objects)
{
for(Object p : Objects2)
{
}
}
这只是简写:
for(Iterator iter = Objects.iterator(); iter.hasNext();)
{
Object o = iter.next();
for(Iterator iter2 = Objects2.iterator(); iter2.hasNext();)
{
Object p = iter2.next();
}
}
If would there be an iter2 reference created for every object I had in Objects?
这取决于Objects2的来源.它来自o吗?它还取决于Objects2.iterator()的实现方式. Iterable#iterator()应该返回独立的迭代器,这意味着Objects2.iterator()几乎肯定会为每次调用返回一个新的Iterator.但是,这并没有说明是否迭代Objects2中的对象(使用iter2)会创建其他新对象.
总的来说,这听起来像是过早的优化.
Which would create less Garbage Collection work?
都不是.增强的for循环(又名for-each循环)只是语法糖.编译器生成的字节码是相同的. Complete example:
package com.stackoverflow;
import java.util.Iterator;
public class Question14640184
{
public void enhancedForLoop(Iterable objects1, Iterable objects2)
{
for(Object o1 : objects1)
{
for(Object o2 : objects2)
{
// do something
}
}
}
public void iteratorForLoop(Iterable objects1, Iterable objects2)
{
for(Iterator iter1 = objects1.iterator(); iter1.hasNext();)
{
Object o1 = iter1.next();
for(Iterator iter2 = objects2.iterator(); iter2.hasNext();)
{
Object o2 = iter2.next();
}
}
}
}
编译:
✗ javac Question14640184.java
✗ javap -c Question14640184
Compiled from "Question14640184.java"
public class com.stackoverflow.Question14640184 extends java.lang.Object{
public com.stackoverflow.Question14640184();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return
public void enhancedForLoop(java.lang.Iterable, java.lang.Iterable);
Code:
0: aload_1
1: invokeinterface #2, 1; //InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
6: astore_3
7: aload_3
8: invokeinterface #3, 1; //InterfaceMethod java/util/Iterator.hasNext:()Z
13: ifeq 57
16: aload_3
17: invokeinterface #4, 1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
22: astore 4
24: aload_2
25: invokeinterface #2, 1; //InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
30: astore 5
32: aload 5
34: invokeinterface #3, 1; //InterfaceMethod java/util/Iterator.hasNext:()Z
39: ifeq 54
42: aload 5
44: invokeinterface #4, 1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
49: astore 6
51: goto 32
54: goto 7
57: return
public void iteratorForLoop(java.lang.Iterable, java.lang.Iterable);
Code:
0: aload_1
1: invokeinterface #2, 1; //InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
6: astore_3
7: aload_3
8: invokeinterface #3, 1; //InterfaceMethod java/util/Iterator.hasNext:()Z
13: ifeq 57
16: aload_3
17: invokeinterface #4, 1; //InterfaceMethod java/util/Iterator.next:()Ljava/lang/Object;
22: astore 4
24: aload_2
25: invokeinterface #2, 1; //InterfaceMethod java/lang/Iterable.iterator:()Ljava/util/Iterator;
30: astore 5
32: aload 5
34: invokeinterface #3, 1; //InterfaceMethod java/util/Iterator.hasNext:()Z
39:
就像我说的那样,for-each循环只有syntactic sugar.
it’s something I’m just fixated on.
继续,朋友.
java foreach6_Java foreach循环是否会创建一个新对象?相关推荐
- java map存放班级和姓名_Java 创建一个HashMap对象,并在其中添加学生的姓名和成绩,键为学生姓名,值为学生成绩,使用增强for循环遍历该HashMap,并输出学生成绩。...
|--需求说明 |--实现思路 1.使用map.containsKey()判断输入的姓名在不在map里面,如果在就打印 2.遍历全班姓名和成绩,需要创建Map.entry,然后在map.entry里面 ...
- Java 创建一个HashMap对象,并在其中添加学生的姓名和成绩,键为学生姓名,值为学生成绩,使用增强for循环遍历该HashMap,并输出学生成绩。...
|--需求说明 如题 |--实现思路 1.使用map.containsKey()判断输入的姓名在不在map里面,如果在就打印 2.遍历全班姓名和成绩,需要创建Map.entry,然后在map.entr ...
- Java实现 foreach循环
Java实现foreach循环遍历集合与数组. 具体代码如下: package package4;import java.util.ArrayList; import java.util.List;/ ...
- java for in 循环_js的for in循环和java里foreach循环的区别分析
本文实例分析了js的for in循环和java里foreach循环的区别.分享给大家供大家参考.具体分析如下: js里的for in循环定义如下: for(var variable in obj) { ...
- 如何在Java中创建一个新的List
本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...
- Java黑皮书课后题第9章:*9.3(使用Date类)编写程序创建一个Date对象,设置它的流逝时间分别为...,然后使用toString()方法分别显示上述日期
Java黑皮书课后题第9章:*9.3(使用Date类)编写程序创建一个Date对象,设置它的流逝时间分别为...,然后使用toString方法分别显示上述日期 题目 代码 思路 代码 题目 代码 思路 ...
- java如何添加进程_如何创建一个进程,如何进程调用进程
java一般用线程就够了,多进程优势在于每个进程互不干扰,劣势在于太耗费内存,任何事情都不是绝对的,在编写Java程序时,有时候需要在Java程序中执行另外一个程序. 1.启动程序 Java提供了两种 ...
- java创建response对象_创建一个HttpResponse对象
创建一个HttpResponse对象 HttpResponse类实现了javax.servlet.http.HttpServletResponse.跟随它的是一个叫做 HttpResponseFaca ...
- java criteria创建_Java hibernate如何创建一个Criteria对象?
本示例向您展示如何创建HibernateCriteria类的实例.要创建一个Criteria我们调用Session对象的工厂方法并传递持久性类作为参数.要执行Criteria查询,我们只需调用list ...
最新文章
- Node.js REST 工具 Restify
- windows哪些版本可以免费升级win10
- jQuery中数组的使用
- 【GVA】gin gorm多对多many2many更新数据时级联更新关联表数据的正确写法
- 九十三、Python使用百度云接口API实现截图,文字识别和语音合成
- java8 遍历目录_使用java8API遍历过滤文件目录及子目录及隐藏文件
- java项目 导出_Java项目的导入和导出
- Jetson TK1 一:调整屏幕分辨率
- CentOS下FastDFS+Nginx(单点部署)事例
- Javaweb技术的校运会报名及比赛管理系统
- Gradle 入门教程(一):Gradle是什么
- android gps信号检测工具,【分享】GPS Test Plus全球GPS定位卫星信号检测工具
- php ayyay,PHP: curl_setopt - Manual
- 辞旧迎新又一年(18年年终总结)
- php小红针有副作用吗,hph小红针精华液怎么样?hph小红针精华液测评
- 常用的oracle时间计算
- 对你快速了解恶意软件以及病毒和反病毒
- python读取页眉页脚,python批量替换页眉页脚
- 阿里妈妈Dolphin分布式向量召回技术详解
- java模拟国际象棋游戏_Javafx实现国际象棋游戏
热门文章
- Android 支付宝 移动支付接口 快速配置
- (转)关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
- \r:command not found
- java linux so_linux平台java调用so动态库
- 服务器centos安装mysql_centos下安装mysql服务器的方法
- confirm关闭 layer_基于 vue+layer.js 超青睐的弹窗组件VueLayer
- ProxySQL!像C罗一样的强大!
- 带你看论文丨全局信息对于图网络文档解析的影响
- 将模型转为NNIE框架支持的wk模型第一步:tensorflow->caffe
- “先加密后签名”是不是安全?看完这篇就秒懂!