增强for循环和普通for循环的区别

此处引用 -----------

1.增强for循环和iterator遍历的效果是一样的,也就说

增强for循环的内部也就是调用iteratoer实现的(可以查看编译后的文件),但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。

2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。

3.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用 增强for循环,也就是iterator。

下面的例子可以证明

public static void main(String[] args)

{

List list = new ArrayList();

for (int i = 0; i

{

list.add(11);

}

long start = System.currentTimeMillis();

int size = list.size();

int c1 = 1;

for (int i = 0; i

{

c1 = list.get(i);

}

System.out.println("for + get(i)方法: " + (System.currentTimeMillis() - start));

long start2 = System.currentTimeMillis();

for (int c2 : list)

{

}

System.out.println("Iterator(foreach)方法:" + (System.currentTimeMillis() - start2));

}

结果:

for + get(i)方法: 94

Iterator(foreach)方法:234

在把ArrayList改为LinkedList,我这里内存溢出了,于是list改成50000

结果:

for + get(i)方法: 6969

Iterator(foreach)方法:0

---------------------

所以在使用的时候适当选择就好了。

多线程中的区别-

// for (Block b : __blocks) {

// b.onDraw(canvas);

// }

// Iterator it = __blocks.iterator();

// while(it.hasNext()){

// Block b = it.next();

// b.onDraw(canvas);

// }

for(int i = 0; i

__blocks.get(i).onDraw(canvas);

}

另外外一个线程动态的改变__blocks的大小    只有普通for循环不报错,其他通过迭代器实现的

是先有一个拷贝,所以真正得到时 ,会报并发修改错误。

在单线程中  增强for不能动态删除元素,用Iterator能实现。

一下是示例代码

Map map = new HashMap();

map.put("1", "a1");

map.put("2", "a2");

map.put("3", "a3");

map.put("4", "a4");

map.put("5", "a5");

for (String key : map.keySet()) {

if ("a2".equals(map.get(key))) {

map.remove(key);

}

}

System.out.println(map.size());

List list = new ArrayList();

list.add("a1");

list.add("a2");

list.add("a3");

list.add("a4");

list.add("a5");

Iterator it = list.iterator();

while (it.hasNext()) {

String v = it.next();

if ("a2".equals(v)) {

it.remove();

}

}

for (String v : list) {

System.out.println(v);

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

此处引用 -----------

1.增强for循环和iterator遍历的效果是一样的,也就说

增强for循环的内部也就是调用iteratoer实现的(可以查看编译后的文件),但是增强for循环 有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。

2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。

3.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用 增强for循环,也就是iterator。

下面的例子可以证明

public static void main(String[] args)

{

List list = new ArrayList();

for (int i = 0; i

{

list.add(11);

}

long start = System.currentTimeMillis();

int size = list.size();

int c1 = 1;

for (int i = 0; i

{

c1 = list.get(i);

}

System.out.println("for + get(i)方法: " + (System.currentTimeMillis() - start));

long start2 = System.currentTimeMillis();

for (int c2 : list)

{

}

System.out.println("Iterator(foreach)方法:" + (System.currentTimeMillis() - start2));

}

结果:

for + get(i)方法: 94

Iterator(foreach)方法:234

在把ArrayList改为LinkedList,我这里内存溢出了,于是list改成50000

结果:

for + get(i)方法: 6969

Iterator(foreach)方法:0

---------------------

所以在使用的时候适当选择就好了。

多线程中的区别-

// for (Block b : __blocks) {

// b.onDraw(canvas);

// }

// Iterator it = __blocks.iterator();

// while(it.hasNext()){

// Block b = it.next();

// b.onDraw(canvas);

// }

for(int i = 0; i

__blocks.get(i).onDraw(canvas);

}

另外外一个线程动态的改变__blocks的大小    只有普通for循环不报错,其他通过迭代器实现的

是先有一个拷贝,所以真正得到时 ,会报并发修改错误。

在单线程中  增强for不能动态删除元素,用Iterator能实现。

一下是示例代码

Map map = new HashMap();

map.put("1", "a1");

map.put("2", "a2");

map.put("3", "a3");

map.put("4", "a4");

map.put("5", "a5");

for (String key : map.keySet()) {

if ("a2".equals(map.get(key))) {

map.remove(key);

}

}

System.out.println(map.size());

List list = new ArrayList();

list.add("a1");

list.add("a2");

list.add("a3");

list.add("a4");

list.add("a5");

Iterator it = list.iterator();

while (it.hasNext()) {

String v = it.next();

if ("a2".equals(v)) {

it.remove();

}

}

for (String v : list) {

System.out.println(v);

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。


相关文章

  • 用穷举法解决问题教学设计(高中信息技术精品)
  • <用穷举法解决问题> 内容选自:教育科学出版社<算法与程序设计>教材第三单元第二节"用穷举法解决问题".教师设计两课时,此教学设计为第一课时. 一.教学目标: 1.知识与技能 (1)了解穷举法在现 ...查看


  • C语言试题及答案
  • 一.问答题 1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用 ":: " 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量.对于有些编译器而言, ...查看


  • 2017华为校招笔试题
  • 2017华为校招笔试题 1.局部变量能否和全局变量重名 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" 局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量.对于有些编译器 ...查看


  • 低屈服点LYP160钢材本构关系研究_王萌
  • 文章编号:1000-6869(2017)02-0055-08DOI :10.14006/j.jzjgxb.2017.02.007 低屈服点LYP160钢材本构关系研究 王 萌,钱凤霞,杨维国 (北京交通大学土木建筑工程学院,北京100044 ...查看


  • C语言源程序
  • C 语言程序设计 C 语言程序设计 1.程序运行从main()函数开始,也从main()函数结束. 2.函数是C 程序的,. 3.C 语言源程序是由函数组成,它们. 4.在C 语言源程序中,是必须有一个函数名为main 的函数.main() ...查看


  • 华为软件测试工程师笔试题及部分答案
  • 1:请你分别划OSI的七层网络结构图,和TCP/IP的五层结构图? OSI的七层网络结构图,和TCP/IP的五层结构图 OSI OSI是Open System Interconnect的缩写,意为开放式系统互联.在OSI出现之前,计算机网络 ...查看


  • 软件公司入职面试笔试题(C++)
  • C++/C试题 本试题仅用于考查C++/C程序员的基本编程技能.内容限于C++/C常用语法,不涉及数据结构.算法以及深奥的语法.考试成绩能反映出考生的编程质量以及对C++/C的理解程度,但不能反映考生的智力和软件开发能力. 笔试时间90分钟 ...查看


  • 三种循环语句的区别与执行过程的解析
  • 1.for 循环的格式 for(表达式1:表达式2,表达式3){ 循环体: } 执行的顺序: 第一次:表达式1->表达式2->循环体->表达式3 第二次:表达式2->循环体->表达式3 第三次:表达式2-> ...查看


  • 循环语句教案
  • 1.2.3循环语句教案 教学目标 1.知识与技能:(1)通过具体的实例理解,了解循环语句的结构特征,掌握循环语句的具 体应用:(2)利用循环语句表达解决具体问题的过程,体会算法的基本思想: 2.过程与方法:借助框图中的循环结构,借助Scil ...查看


热门内容