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循环是否会创建一个新对象?相关推荐

  1. java map存放班级和姓名_Java 创建一个HashMap对象,并在其中添加学生的姓名和成绩,键为学生姓名,值为学生成绩,使用增强for循环遍历该HashMap,并输出学生成绩。...

    |--需求说明 |--实现思路 1.使用map.containsKey()判断输入的姓名在不在map里面,如果在就打印 2.遍历全班姓名和成绩,需要创建Map.entry,然后在map.entry里面 ...

  2. Java 创建一个HashMap对象,并在其中添加学生的姓名和成绩,键为学生姓名,值为学生成绩,使用增强for循环遍历该HashMap,并输出学生成绩。...

    |--需求说明 如题 |--实现思路 1.使用map.containsKey()判断输入的姓名在不在map里面,如果在就打印 2.遍历全班姓名和成绩,需要创建Map.entry,然后在map.entr ...

  3. Java实现 foreach循环

    Java实现foreach循环遍历集合与数组. 具体代码如下: package package4;import java.util.ArrayList; import java.util.List;/ ...

  4. java for in 循环_js的for in循环和java里foreach循环的区别分析

    本文实例分析了js的for in循环和java里foreach循环的区别.分享给大家供大家参考.具体分析如下: js里的for in循环定义如下: for(var variable in obj) { ...

  5. 如何在Java中创建一个新的List

    本文翻译自:How to make a new List in Java We create a Set as: 我们创建一个Set为: Set myset = new HashSet() How d ...

  6. Java黑皮书课后题第9章:*9.3(使用Date类)编写程序创建一个Date对象,设置它的流逝时间分别为...,然后使用toString()方法分别显示上述日期

    Java黑皮书课后题第9章:*9.3(使用Date类)编写程序创建一个Date对象,设置它的流逝时间分别为...,然后使用toString方法分别显示上述日期 题目 代码 思路 代码 题目 代码 思路 ...

  7. java如何添加进程_如何创建一个进程,如何进程调用进程

    java一般用线程就够了,多进程优势在于每个进程互不干扰,劣势在于太耗费内存,任何事情都不是绝对的,在编写Java程序时,有时候需要在Java程序中执行另外一个程序. 1.启动程序 Java提供了两种 ...

  8. java创建response对象_创建一个HttpResponse对象

    创建一个HttpResponse对象 HttpResponse类实现了javax.servlet.http.HttpServletResponse.跟随它的是一个叫做 HttpResponseFaca ...

  9. java criteria创建_Java hibernate如何创建一个Criteria对象?

    本示例向您展示如何创建HibernateCriteria类的实例.要创建一个Criteria我们调用Session对象的工厂方法并传递持久性类作为参数.要执行Criteria查询,我们只需调用list ...

最新文章

  1. Node.js REST 工具 Restify
  2. windows哪些版本可以免费升级win10
  3. jQuery中数组的使用
  4. 【GVA】gin gorm多对多many2many更新数据时级联更新关联表数据的正确写法
  5. 九十三、Python使用百度云接口API实现截图,文字识别和语音合成
  6. java8 遍历目录_使用java8API遍历过滤文件目录及子目录及隐藏文件
  7. java项目 导出_Java项目的导入和导出
  8. Jetson TK1 一:调整屏幕分辨率
  9. CentOS下FastDFS+Nginx(单点部署)事例
  10. Javaweb技术的校运会报名及比赛管理系统
  11. Gradle 入门教程(一):Gradle是什么
  12. android gps信号检测工具,【分享】GPS Test Plus全球GPS定位卫星信号检测工具
  13. php ayyay,PHP: curl_setopt - Manual
  14. 辞旧迎新又一年(18年年终总结)
  15. php小红针有副作用吗,hph小红针精华液怎么样?hph小红针精华液测评
  16. 常用的oracle时间计算
  17. 对你快速了解恶意软件以及病毒和反病毒
  18. python读取页眉页脚,python批量替换页眉页脚
  19. 阿里妈妈Dolphin分布式向量召回技术详解
  20. java模拟国际象棋游戏_Javafx实现国际象棋游戏

热门文章

  1. Android 支付宝 移动支付接口 快速配置
  2. (转)关于数据库存储过程分页DatagridView BindingNavigator 控件的详细实现
  3. \r:command not found
  4. java linux so_linux平台java调用so动态库
  5. 服务器centos安装mysql_centos下安装mysql服务器的方法
  6. confirm关闭 layer_基于 vue+layer.js 超青睐的弹窗组件VueLayer
  7. ProxySQL!像C罗一样的强大!
  8. 带你看论文丨全局信息对于图网络文档解析的影响
  9. 将模型转为NNIE框架支持的wk模型第一步:tensorflow->caffe
  10. “先加密后签名”是不是安全?看完这篇就秒懂!