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

时间:2021-10-29 05:50:48

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> ):将集合中元素按照指定规则排序。

 public class CollectionsDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
//原来写法
//list.add(12);
//list.add(14);
//list.add(15);
//list.add(1000);
//采用工具类 完成 往集合中添加元素
Collections.addAll(list, 5, 222, 1,2);
System.out.println(list);
//排序方法
Collections.sort(list);
System.out.println(list);
}
}
结果:
[5, 222, 1, 2]
[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(): 返回迭代的下一个元素。

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

迭代器的实现原理

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

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

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

 import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator; public class Demo {
public static void main(String[] args) {
// 创建集合对象
Collection<String> coll = new ArrayList<>();
// 给集合容器中添加元素
coll.add("abc");
coll.add("bcd");
coll.add("cde");
coll.add("def");
coll.add("abc"); // 遍历集合 ,遇到"abc"就删除
Iterator<String> it = coll.iterator();
while( it.hasNext() ) {
// 取出数据
String next = it.next();
// 判断取出的数据是否为abc
if( next.equals("abc") ) {
/*
当我们在使用迭代器对集合中的元素进行迭代时,不允许使用集合中自带的
增删方法对集合中的元素进行操作。因为集合基于iterator获取一个迭代器
此时这个迭代器是针对集合中的元素而获取的,如果此时用集合自身的方法进行
增删擦操作那么集合中的元素就会发生变化。
导致在获取迭代器之前和正在迭代的元素不一样,所以不允许这么干。
*/
// coll.remove(next); // 报错 // 在使用迭代器遍历集合时,只能使用迭代器中的方法删除集合中的数据
it.remove();
}
}
// 打印集合
System.out.println("coll = " + coll); }
}

注意

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

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

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

增强for循环

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

  格式:

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

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

遍历数组

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

遍历集合

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