在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
接口完成。
以上两种比较器第一篇文章有讲到...
Java针对所有集合容器进行共性取出方式的抽取,于是针对所有的集合定义了一个接口,在这个接口中描述了所有集合容器的共性遍历规则。java.util.Iterator
Iterator
接口也是Java集合中的一员,但它与Collection
、Map
接口有所不同:
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对象迭代元素的过程:
在调用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 }
注意
-
使用迭代器对集合进行迭代的时候,不要使用集合自身的功能对集合进行增删操作。
-
所有的迭代器当迭代结束之后,那么这个迭代器就位于集合的最后。无法再进行迭代,所以一般针对于集合的迭代使用for循环。
-
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 }