jdk1.5新特性之增强for循环

来源:互联网 发布:2016网络经典小说 编辑:程序博客网 时间:2024/05/16 05:06

Jdk1.5新特性之增强for循环

 

1.概念:java SE5引入了一种新的更加简洁的for循环,即增强for循环,也叫Foreach循环(是for循环的一种),用于数组和容器(集合类)。使用foreach循环遍历数组和集合元素时,无需获得数组和集合长度,无需根据索引来访问数组元素和集合元素,因为强大的foreach循环会自动遍历数组和集合的每一个元素。

2.Foreach循环的格式:

  for(type  variableName : array | collection)

{

  //variableName 自动迭代访问每一个元素....

}

对格式解释:

type是数组元素或者集合元素的类型,variableName表示一个形参名,array | collection是需要被迭代的数组或者集合(该集合是一个实现了Iterable接口的类对象),foreach循环将自动将数组元素、集合元素依次赋给该变量。

3.传统for循环和增强for循环:

 举一个最简单的例子,定义一个整形数组并初始化,然后要打印该数组的元素。

 传统for循环的做法:

 

int [] arr =newint[]{2,3,5,70,12,34};

      for(int i=0;i<arr.length;i++){

         System.out.print(arr[i]+",");

      }

传统数组用旧式的for循环组装的,组装时必须按索引访问它。

foreach 循环的做法:

int [] arr =newint[]{2,3,5,70,12,34};

      for(int arrEle :arr){

         System.out.println(arrEle+",");

      }

在foreach循环中就不需要索引了。任何返回一个数组的方法都可以使用foreach循环。例如,String类有一个方法toCharArray(),

它返回一个char数组,也可以使用foreach循环

for(char c :"I love java , do you ?".toCharArray()){

         System.out.print(c+" ");

      }

那么可以很容易的知道foreach循环比传统的循环更加的简洁,是的遍历数组或集合更加便利。但是,如果需要根据索引来访问数组或集合中的某一个元素,那么foreach循环就做不到了,这时候就需要传统的for循环了。

4.foreach循环的弊端以及如何解决:

 从上面可以看出foreach循环比传统for循环更加便利,但是,foreach循环也是有弊端的,就是foreach循环的目标不能为null,我们来看看下面这段代码:

List<String> list = null;

      for(String l :list){

         System.out.print(l);

      }

运行后跑出异常:

Exception in thread "main" java.lang.NullPointerException

那如何解决弊端呢?那就要先对需要迭代的目标进行null判断。

List<String> list = null;

      if(list !=null){

       for(String l :list){

         System.out.print(l);

      }

}

我们在获取数组或集合元素时先对该集合或数组进行判断,其实这就是迭代器的功能,接下来会说foreach循环和迭代器。

5.迭代器和for-each循环:

 foreach循环构建在迭代器之上。为了遍历集合,集合必须能够通过发送消息iterator,已返回一个迭代器。foreach循环通过检验集合是否实现了接口 java.lang.Iterable,从而判断某个集合是否可以迭代。

一下代码仅限参考:

publicclass addString<String>implementsIterable{

 

   private ArrayList<String>arrlist = new ArrayList<>();

  

   publicvoid addStr(String s){

      arrlist.add(s);

   }

   public String getStr(int i){

      returnarrlist.get(i);

   }

   @Override

   public Iterator<String> iterator() {

      // TODO Auto-generated method stub

      returnarrlist.iterator();

   }

}

然后有一个测试类

publicclass TestIterate {

   publicstaticvoid main(String[] args) {

     

      addString<String> addS=new addString<>();

      addS.addStr("wo");

      addS.addStr("love");

      addS.addStr("java");

 

      for(String s :addS){

         System.out.println(s);

      }  

   }

}

迭代器就可以对addS进行迭代。

0 0
原创粉丝点击