/** * 迭代器的概念: * 以下来自网络搜索 * 简单的解释: 迭代器是一种检查容器内元素并遍历元素的数据类型。 * 迭代器模式(Iterator):提供一种措施次序走访一个聚合对象中各个元素,而又不泄露该对象的内部表示。 * 迭代器是跟容器紧密结合的,不同的容器,它的迭代器不同,但是,他们有共同的目标,就是可以通过该迭代器 * 来遍历访问这个容器里面的元素.有很多例子表明,有了迭代器,我们可以将算法和特定的容器分离开来。 * * 网络补充:比如,在容器中查找一个元素。对于查找这个操作,一般来说就是遍历整个集合, * 然后找到那个要找的元素,但是,如果没有迭代器,我们需要为vector和List设计两个查找算法, * 因为找下一个元素在vector和List中的操作不同。同样的思想却要两套代码,显然这是不优秀的。 迭代器的使用: 获取迭代器的方式是使用Collection定义的方法: Iterator iterator() 迭代器用于遍历集合的两个主要方法: boolean hasNext():判断集合是否还有元素可以遍历。 E next():返回迭代的下一个元素 注意:遍历集合应遵循“先问后取”的方式,也就是说,应当在确定hasNext()方法的返回值为true的情况下 再通过next()方法取元素。由此可以看出,使用迭代器遍历集合是通过boolean值驱动的, 所以它更适合使用while循环来遍历。 注意: 使用迭代器遍历集合遵循: 问,取,删 ,其中删除不是必须操作。 ------------------------------------------------------------------------------------ 案例1 使用Iterator的hasNext方法、next方法遍历集合 1) 使用HashSet构建集合c,将字符串“java”、“cpp”、“php”、“c#”、“objective-c”放入集合c中。 2) 遍历集合中的每一个元素,并输出。 ------------------------------------------------------------------------------------ 案例2 使用Iterator的remove方法移除元素 1) 删除集合c中包含字符“c”的字符串元素。 */ public class IteratorDemo { public static void main(String[] args) { /*案例1 使用Iterator的hasNext方法、next方法遍历集合*/ //1) 使用HashSet构建集合c,将字符串“java”、“cpp”、“php”、“c#”、“objective-c”放入集合c中。 Collection<String> c = new HashSet<String>(); c.add("java"); c.add("cpp"); c.add("php"); c.add("c#"); c.add("objective-c"); //2) 遍历集合中的每一个元素,并输出。 Iterator<String> iterator = c.iterator(); /*使用Collection接口的iterator方法,获取迭代器接口Iterator,*/ /* * 使用Iterator接口提供的hasNext方法,循环判断集合中是否还有未迭代的元素; * 然后,在循环中,使用Iterator接口提供的next方法返回当前指针位置的元素,并将指针后移 */ while(iterator.hasNext()){ String str = iterator.next(); /*这里因为已经指定了泛型为String, 所以不需要做类型的强转*/ System.out.println(str); /*输出结果: c# cpp objective-c java php */ } /*案例2 使用Iterator的remove方法移除元素*/ //注意:次数迭代器需要定义新的,因为上面的案例迭代器的指针已经移到最后一位. Iterator<String> iterator2 = c.iterator(); while(iterator2.hasNext()){ String str = iterator2.next(); if((str.indexOf("c"))!=-1){ //c.remove(str); /* 虽然这句话编译通过,但是运行时会抛出异常 * 原因:在使用迭代器遍历集合的过程中, * 不能通过集合的方法增删元素,需要通过Iterator的remove方法 */ iterator2.remove(); //正确写法 System.out.println(str+"删除成功"); } } System.out.println("c集合删除后的内容:"+c); /* 输出结果: * c#删除成功 cpp删除成功 objective-c删除成功 c集合删除后的内容:[java, php] */ } }
ForDemo 新循环演示
/** * Java5.0之后推出了一个新的特性,增强for循环,也称为新循环。 * 该循环不通用于传统循环的工作,其只用于便利集合或数组。 语法: * for(元素类型 e : 集合或数组){ 循环体 } 注意:新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式。所以新循环本质上是迭代器。 ---------------------------------------------------------------------------------- 案例 使用foreach循环遍历集合中的元素,详细要求如下: 1) 使用HashSet构建集合c,将字符串“java”、“cpp”、“php”、“c#”、“objective-c”放入集合c中。 2) 使用foreach循环遍历集合中的每一个元素,并将每一个字符串元素转化为大写形式。 */ public class ForDemo { public static void main(String[] args) { /*案例 使用foreach循环遍历集合中的元素*/ //1) 使用HashSet构建集合c,将字符串“java”、“cpp”、“php”、“c#”、“objective-c”放入集合c中。 Collection<String> c = new HashSet<String>(); c.add("java"); c.add("cpp"); c.add("php"); c.add("c#"); c.add("objective-c"); //2) 使用foreach循环遍历集合中的每一个元素,并将每一个字符串元素转化为大写形式。 for(String str: c){ System.out.println(str.toUpperCase()); /*输出结果: C# CPP OBJECTIVE-C JAVA PHP */ /*以上代码可以理解为每次从集合c中取出一个String对象,然后赋值给循环变量str。 *事实上,Java编译器在编译前会将其转换为迭代器的形式 *(因此不能在循环体中对集合进行删除操作)。*/ } } }
时间: 2024-10-11 21:25:47