全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java新特性之for循环最全的用法总结

1. 增强for概述

增强for循环,也叫Foreach循环,用于数组和容器(集合类)的遍历。使用foreach循环遍历数组和集合元素时,无需获得数组和集合长度,无需根据索引来访问数组元素和集合元素,大大提高的效率,代码也简洁不少。

2. Oracle官网的解释

So when should you use the for-each loop? Any time you can. It really beautifies your code. Unfortunately, you cannot use it everywhere. Consider, for example, the expurgate method. The program needs access to the iterator in order to remove the current element. The for-each loop hides the iterator, so you cannot call remove. Therefore, the for-each loop is not usable for filtering. Similarly it is not usable for loops where you need to replace elements in a list or array as you traverse it. Finally, it is not usable for loops that must iterate over multiple collections in parallel. These shortcomings were known by the designers, who made a conscious decision to go with a clean, simple construct that would cover the great majority of cases.

所以你应该什么时候使用for-each循环?任何时候都可以。这真的美化你的代码。不幸的是,你不能在任何地方使用它。考虑这些情况,例如,删除方法。为了移除当前的元素,该程序需要访问迭代器。for-each循环隐藏了迭代器,所以你不能调用删除功能。因此,for-each循环不适用于过滤元素。同样当遍历集合或数组时需要替换元素的循环也是不适用的。最后,它不适用于多个集合迭代中并行循环使用。设计师应该了解这些缺陷,有意识地设计一个干净,简单的构造,来避免这些情况。有兴趣的可以查看官网的API,如果不知道怎么在官网找到API,请点击打开官网查看API方法。

3. 增强for格式

for(集合或者数组元素的类型 变量名 : 集合对象或者数组对象){

引用变量名的java语句;

}

官网解释:


for (TimerTask t : c)
t.cancel();

When you see the colon (:) read it as “in.” The loop above reads as “for each TimerTask t in c.” As you can see, the for-each construct combines beautifully with generics. It preserves all of the type safety, while removing the remaining clutter. Because you don't have to declare the iterator, you don't have to provide a generic declaration for it. (The compiler does this for you behind your back, but you need not concern yourself with it.)

大意为:

当你看到冒号(:),它读作“进来。”上述循环读作“把c中的每个TimerTask元素进行遍历。”正如你所看到的,for-each结构完美的与泛型结合。它保留了所有类型的安全性,同时去除剩余的混乱。因为你不必声明迭代器,你不必为它提供一个泛型的声明。 (编译器在你背后已经做了,你不需要关心它。)


简单体验下:

1. 增强for遍历数组

package cn.jason01;
//增强for遍历数组
public class ForTest01 {
 public static void main(String[] args) {
 int[] array={1,2,3};
 for(int element: array){
 System.out.println(element);
 }
 }
}

2.增强for遍历集合


package cn.jason01;

import java.util.ArrayList;

public class ForTest {
 public static void main(String[] args) {
 // 泛型推断,后面可以写可以不写String
 ArrayList<String> array = new ArrayList();
 array.add("a");
 array.add("b");
 array.add("c");
 for (String string : array) {
 System.out.println(string);
 }

 }
}

4. 增强for底层原理

先看代码

package cn.jason01;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 增强for底层原理
 * 
 * @author cassandra
 * @version 1.1
 */
public class ForTest {
	public static void main(String[] args) {
		// 泛型推断,后面可以写可以不写String.规范一些是要写上的。
		ArrayList<String> array = new ArrayList();
		// 添加元素
		array.add("a");
		array.add("b");
		array.add("c");

		// 增强for实现
		System.out.println("----enhanced for----");
		for (String string : array) {
			System.out.println(string);
		}

		// 反编译之后的效果,也就是底层实现原理
		System.out.println("---reverse compile---");
		String string;
		for (Iterator iterator = array.iterator(); iterator.hasNext(); System.out.println(string)) {
			string = (String) iterator.next();

		}

		// 迭代器实现
		System.out.println("------Iterator------");
		for (Iterator<String> i = array.iterator(); i.hasNext(); System.out.println(i.next())) {

		}

		// 普通for实现
		System.out.println("-----general for-----");
		for (int x = 0; x < array.size(); x++) {
			System.out.println(array.get(x));
		}
	}
}

从上面代码可以看出,底层是由迭代器实现的,增强for实际上是隐藏了迭代器,所以不用创建迭代器自然代码简洁不少。这也是增强for推出的原因,就是为了减少代码,方便遍历集合和数组,提高效率。

注意:正因为增强for隐藏了迭代器,所以用增强for遍历集合和数组时,要先判断是否为null,否则会抛出空指针异常。原因很简单,底层需要用数组或者集合对象去调用iterator()方法去创建迭代器(Iterator迭代器是一个接口,所以要用子类来实现),如果是null,肯定抛出异常。

5. 增强for的适用性以及局限性

1.适用性

适用于集合和数组的遍历。

2.局限性:

①集合不能为null,因为底层是迭代器。

②隐藏了迭代器,所以在遍历集合时不能对集合进行修改(增删)。

③不能设置角标。

6.增强for用法详解

1.增强for在数组中用法

package cn.jason05;

import java.util.ArrayList;
import java.util.List;

/**
 * 增强for用法
 * 
 * @author cassandra
 */
public class ForDemo {
 public static void main(String[] args) {
 // 遍历数组
 int[] arr = { 1, 2, 3, 4, 5 };
 for (int x : arr) {
 System.out.println(x);
 }
 }
}

2.增强for在集合中用法


package cn.jason05;

import java.util.ArrayList;
import java.util.List;

/**
 * 增强for用法
 * 
 * @author cassandra
 */
public class ForDemo {
 public static void main(String[] args) {
 // 遍历集合
 ArrayList<String> array = new ArrayList<String>();
 array.add("hello");
 array.add("world");
 array.add("java");

 for (String s : array) {
 System.out.println(s);
 }

 // 集合为null,抛出NullPointerException空指针异常
 List<String> list = null;
 if (list != null) {
 for (String s : list) {
 System.out.println(s);
 }
 }

 // 增强for中添加或修改元素,抛出ConcurrentModificationException并发修改异常
 for (String x : array) {
 if (array.contains("java"))
 array.add(1, "love");
 }

 }

3.泛型与增强for完美结合

注意:必须要与泛型完美结合,不然还得手动向下转型

1.没有泛型效果,不能使用增强for

Student类

package cn.jason01;

public class Student {
 private String name1;
 private String name2;

 public Student() {
 super();
 }

 public Student(String name1, String name2) {
 super();
 this.name1 = name1;
 this.name2 = name2;
 }

 public String getName1() {
 return name1;
 }

 public void setName1(String name1) {
 this.name1 = name1;
 }

 public String getName2() {
 return name2;
 }

 public void setName2(String name2) {
 this.name2 = name2;
 }

}

测试代码

package cn.jason01;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test02 {
 public static void main(String[] args) {
 // 创建集合1
 List list1 = new ArrayList();
 list1.add("a");
 list1.add("b");
 list1.add("c");

 // 创建集合2
 List list2 = new ArrayList();
 list2.add("d");
 list2.add("e");
 list2.add("f");
 // 创建集合三
 List list3 = new ArrayList();

 // 遍历第一和第二个集合,并添加元素到集合三
 for (Iterator i = list1.iterator(); i.hasNext();) {
 // System.out.println(i.next());
 String s = (String) i.next();
 for (Iterator j = list2.iterator(); j.hasNext();) {
 // list2.add(new Student(s,j.next()));
 String ss = (String) j.next();
 list3.add(new Student(s, ss));
 }
 }

 // 遍历集合三,并输出元素
 Student st;
 for (Iterator k = list3.iterator(); k.hasNext(); System.out
 .println(new StringBuilder().append(st.getName1()).append(st.getName2()))) {
 st = (Student) k.next();
 }
 }
}

上面的代码如果去掉注释的两行代码,程序就会报错,因为集合没有声明元素是什么类型,迭代器自然也不知道是什么类型。所以没有泛型,那么就要向下转型,只能用迭代器,不能用增强for。

2.泛型与增强for

泛型修改上面代码

package cn.jason01;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 增强for和泛型完美结合
 * 
 * @author cassandra
 */
public class Test03 {
 public static void main(String[] args) {
 // 创建集合1
 List<String> list1 = new ArrayList<String>();
 list1.add("a");
 list1.add("b");
 list1.add("c");

 // 创建集合2
 List<String> list2 = new ArrayList<String>();
 list2.add("d");
 list2.add("e");
 list2.add("f");
 // 创建集合三
 List<Student> list3 = new ArrayList<Student>();

 //// 遍历第一和第二个集合,并添加元素到集合三
 for (String s1 : list1) {
 for (String s2 : list2) {
 list3.add(new Student(s1, s2));
 }
 }

 // 遍历集合三,并输出元素
 for (Student st : list3) {
 System.out.println(new StringBuilder().append(st.getName1()).append(st.getName2()));
 }
 }
}

4.List集合遍历四种方法

Collection接口中有iterator()方法,返回的是Iterator类型,有一个迭代器为Iterator。List中有listIterator()方法,所以多了一个集合器ListIterator,其子类LinkedList、ArrayList、Vector都实现了List和Collection接口,所以都可以用两个迭代器遍历。

代码测试

package cn.jason05;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/**
 * 这是List集合遍历四种方法
 * 
 * @author cassandra
 */

public class ForDemo01 {
 public static void main(String[] args) {
 // 创建集合
 List<String> list = new ArrayList<String>();
 list.add("hello");
 list.add("world");
 list.add("java");

 // 方法1,Iterator迭代器遍历
 Iterator<String> i = list.iterator();
 while (i.hasNext()) {
 String s = i.next();
 System.out.println(s);
 }

 // 方法2,ListIterator迭代器遍历集合
 ListIterator<String> lt = list.listIterator();
 while (lt.hasNext()) {
 String ss = lt.next();
 System.out.println(ss);
 }

 // 方法3,普通for遍历集合
 for (int x = 0; x < list.size(); x++) {
 String sss = list.get(x);
 System.out.println(sss);
 }

 // 方法4,增强for遍历集合
 for (String ssss : list) {
 System.out.println(ssss);
 }

 }
}

5.Set集合遍历2中方法

由于Set集合没有get(int index)方法,所以没有普通for循环,Set中没有listIterator()方法,所以没有ListIterator迭代器。所以只有两种遍历方式。

代码测试

package cn.jason05;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class ForTest03 {
 public static void main(String[] args) {
 Set<String> set = new HashSet<String>();
 set.add("hello");
 set.add("world");
 set.add("java");

 // 方法1,Iterator迭代器遍历集合
 Iterator<String> it = set.iterator();
 while (it.hasNext()) {
 System.out.println(it.next());
 }

 // 方法2,增强for遍历集合
 for (String s : set) {
 System.out.println(s);
 }

 }
}

7.归纳总结

1.增强for的适用性以及局限性

适用性:适用于集合和数组的遍历。

局限性:

①集合不能为null,因为底层是迭代器。

②不能设置角标。

③隐藏了迭代器,所以在遍历集合时不能对集合进行修改(增删)。

2.在集合中增强for与泛型结合,才能发挥新特性的作用。

3.查看官网新特性挺重要的,要知其然还要知其所以然,了如心中,才能运用自如。

以上这篇java新特性之for循环最全的用法总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# java  # for循环用法  # Java新特性之Nashorn_动力节点Java学院整理  # Java中使用StackWalker和Stream API进行堆栈遍历  # Java基础之多线程  # Java读取本地json文件及相应处理方法  # Java使用openOffice对于word的转换及遇到的问题解决  # Java中比较运算符compareTo()、equals()与==的区别及应用总结  # java源码解析之String类的compareTo(String otherString)方法  # Java11 发布前抓紧掌握这些新特性  # 遍历  # 迭代  # 官网  # 抛出  # 适用于  # 的是  # 子类  # 中有  # 新特性  # 你不  # 第二个  # 给大家  # 四种  # 能为  # 能对  # 你不必  # 不写  # 是一个  # 这是  # 变量名 


相关文章: python的本地网站制作,如何创建本地站点?  如何在宝塔面板中修改默认建站目录?  如何在IIS7上新建站点并设置安全权限?  C#怎么创建控制台应用 C# Console App项目创建方法  如何制作一个表白网站视频,关于勇敢表白的小标题?  如何生成腾讯云建站专用兑换码?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  宁波自助建站系统如何快速打造专业企业网站?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何使用Golang table-driven基准测试_多组数据测量函数效率  定制建站流程解析:需求评估与SEO优化功能开发指南  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  ,想在网上投简历,哪几个网站比较好?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  已有域名和空间如何搭建网站?  ,怎么在广州志愿者网站注册?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何选择香港主机高效搭建外贸独立站?  宿州网站制作公司兴策,安徽省低保查询网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  如何快速完成中国万网建站详细流程?  如何选择网络建站服务器?高效建站必看指南  如何在IIS中新建站点并解决端口绑定冲突?  Python如何创建带属性的XML节点  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  如何通过宝塔面板实现本地网站访问?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  高端智能建站公司优选:品牌定制与SEO优化一站式服务  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  淘宝制作网站有哪些,淘宝网官网主页?  定制建站方案优化指南:企业官网开发与建站费用解析  如何用y主机助手快速搭建网站?  建站之星与建站宝盒如何选择最佳方案?  内部网站制作流程,如何建立公司内部网站?  建站主机是否属于云主机类型?  如何快速搭建二级域名独立网站?  如何在IIS中配置站点IP、端口及主机头?  建站之星后台密码遗忘或太弱?如何重置与强化?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  建站之星安装模板失败:服务器环境不兼容?  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  建站org新手必看:2024最新搭建流程与模板选择技巧  ppt制作免费网站有哪些,ppt模板免费下载网站?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  微课制作网站有哪些,微课网怎么进? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。