JavaSE Collections类 , Iterator迭代器 , 增强for循环

Collections

它是集合的工具类,为集合体系扩展了一些其他的方法。类中都是静态的方法,可以使用类名直接调用。

可变参数

JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格式:

  修饰符 返回值类型 方法名(参数类型... 形参名){  }

其实这个书写完全等价与

  修饰符 返回值类型 方法名(参数类型[] 形参名){  }

只是后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。

JDK1.5以后。出现了简化操作。... 用在参数上,称之为可变参数。

同样是代表数组,但是在调用这个带有可变参数的方法时,不用创建数组(这就是简单之处),直接将数组中的元素作为实际参数进行传递,其实编译成的class文件,将这些元素先封装到一个数组中,在进行传递。这些动作都在编译.class文件时,自动完成了

常用功能

  • public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。

  • public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。

  • public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。

  • public static <T> void sort( List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。

 1 public class CollectionsDemo {
 2     public static void main(String[] args) {
 3         ArrayList<Integer> list = new ArrayList<Integer>();
 4         //原来写法
 5         //list.add(12);
 6         //list.add(14);
 7         //list.add(15);
 8         //list.add(1000);
 9         //采用工具类 完成 往集合中添加元素  
10         Collections.addAll(list, 5, 222, 1,2);
11         System.out.println(list);
12         //排序方法 
13         Collections.sort(list);
14         System.out.println(list);
15     }
16 }
17 结果:
18 [5, 222, 1, 2]
19 [1, 2, 5, 222]

代码演示之后 ,发现我们的集合按照自然顺序进行了排列,那么它是怎么完成排序的功能的呢?

在JAVA中提供了两种大小比较实现的方式:

一种是比较死板的,按照对象的自然顺序进行比较的方式,采用java.lang.Comparable接口去实现。

一种是灵活的,可以根据需求,规定对象的排序方式,采用java.util.Comparator接口完成。

以上两种比较器第一篇文章有讲到...

Iterator迭代器

在程序开发中,经常需要遍历集合中的所有元素。由于集合框架中的集合容器太多,而每个集合容器中保存的数据存储的方式都不一样。于是导致我们取出数据的方式也完全不相同。

Java针对所有集合容器进行共性取出方式的抽取,于是针对所有的集合定义了一个接口,在这个接口中描述了所有集合容器的共性遍历规则。java.util.Iterator

Iterator接口也是Java集合中的一员,但它与CollectionMap接口有所不同:

Collection接口与Map接口主要用于存储元素

Iterator主要用于迭代访问Collection中的元素,因此Iterator对象也被称为迭代器。

想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法:

  • public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的。

下面介绍一下迭代的概念:

  • 迭代:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,然后继续在判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

Iterator接口的常用方法如下:

  • public boolean hasNext(): 如果仍有元素可以迭代,则返回 true。

  • public E next(): 返回迭代的下一个元素。

 1 public class IteratorDemo {
 2       public static void main(String[] args) {
 3         // 使用多态方式 创建对象
 4         Collection<String> coll = new ArrayList<String>();
 5 
 6         // 添加元素到集合
 7         coll.add("串串星人");
 8         coll.add("吐槽星人");
 9         coll.add("汪星人");
10         //遍历
11         //使用迭代器 遍历   每个集合对象都有自己的迭代器
12         Iterator<String> it = coll.iterator();
13         //  泛型指的是 迭代出 元素的数据类型
14         while(it.hasNext()){ //判断是否有迭代元素
15             String s = it.next();//获取迭代出的元素
16             System.out.println(s);
17         }
18       }
19 }

迭代器的实现原理

我们在之前案例已经完成了Iterator遍历集合的整个过程。当遍历集合时,首先通过调用集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。

Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程:

在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

 1 import java.util.ArrayList;
 2 import java.util.Collection;
 3 import java.util.Iterator;
 4 
 5 public class Demo {
 6     public static void main(String[] args) {
 7         // 创建集合对象
 8         Collection<String> coll = new ArrayList<>();
 9         // 给集合容器中添加元素
10         coll.add("abc");
11         coll.add("bcd");
12         coll.add("cde");
13         coll.add("def");
14         coll.add("abc");
15 
16         // 遍历集合 ,遇到"abc"就删除
17         Iterator<String> it = coll.iterator();
18         while( it.hasNext() ) {
19            // 取出数据
20             String next = it.next();
21             // 判断取出的数据是否为abc
22             if( next.equals("abc") ) {
23                 /*
24                      当我们在使用迭代器对集合中的元素进行迭代时,不允许使用集合中自带的
25                      增删方法对集合中的元素进行操作。因为集合基于iterator获取一个迭代器
26                      此时这个迭代器是针对集合中的元素而获取的,如果此时用集合自身的方法进行
27                      增删擦操作那么集合中的元素就会发生变化。
28                      导致在获取迭代器之前和正在迭代的元素不一样,所以不允许这么干。
29                 */
30                 // coll.remove(next); // 报错
31 
32                 // 在使用迭代器遍历集合时,只能使用迭代器中的方法删除集合中的数据
33                 it.remove();
34             }
35         }
36         // 打印集合
37         System.out.println("coll = " + coll);
38 
39     }
40 }

注意

  1. 使用迭代器对集合进行迭代的时候,不要使用集合自身的功能对集合进行增删操作。

  2. 所有的迭代器当迭代结束之后,那么这个迭代器就位于集合的最后。无法再进行迭代,所以一般针对于集合的迭代使用for循环。

  3. 使用迭代器迭代集合的时候,每一个hasNext方法都对应一个next,不要一个hasNext方法对应多个next。

增强for循环

增强for循环 (也称foreach循环) 是JDK1.5增加的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。

  格式:

 1 for( 元素的数据类型 变量 : Collection集合or数组 ){ 2 //写操作代码 3 } 

它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。

遍历数组

1 public class NBForDemo1 {
2     public static void main(String[] args) {
3         int[] arr = {3,5,6,87};
4            //使用增强for遍历数组
5         for(int a : arr){//a代表数组中的每个元素
6             System.out.println(a);
7         }
8     }
9 }

遍历集合

 1 public class NBFor {
 2     public static void main(String[] args) {        
 3         Collection<String> coll = new ArrayList<String>();
 4         coll.add("小河神");
 5         coll.add("老河神");
 6         coll.add("神婆");
 7         //使用增强for遍历
 8         for( String s :coll ){//接收变量s代表 代表被遍历到的集合元素
 9             System.out.println(s);
10         }
11     }
12 }

猜你喜欢

转载自www.cnblogs.com/ownmg/p/10707354.html
今日推荐