Java之集合的遍历与迭代器
集合的遍历
依次获取集合中的每一个元素
将集合转换成数组,遍历数组
//取出所有的学号, 迭代之后显示学号为1004-1009
Object[] c=map.keySet().toArray();//取出学号转换为数组
System.out.println(c);
for (int i = 0; i < c.length; i++) {
int n=(int)c[i];//数组向下转型
if(n>=1004&&n<=1009){
System.out.println(n);
}
}
for循环与迭代器
package collectionTest;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class test {
public static void main(String[] args) {
List list=new ArrayList();
list.add("aaa");
list.add("ccc");
list.add("vvv");
list.add("bbb");
list.add("nnn");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
//foreach循环遍历,没有下标,需要的话可以自己定义
for(Object s:list){
System.out.println(s);
}
Iterator iter=list.iterator();
while(iter.hasNext()){//判断有没有下一个
System.out.println(iter.next());
}
Map map=new HashMap();
map.put("aa", 1);
map.put("bb", 2);
map.put("cc", 3);
map.put("dd", 4);
Set set=map.keySet();//返回Set集合,存放map的键的值
for(Object o:set){
System.out.println(o);//输出对象的键
System.out.println(map.get(o));//输出对象的值,无序
}
Iterator iter2=set.iterator();
while(iter2.hasNext()){//遍历
System.out.println(map.get(iter2.next()));
}
Collection c=map.values();//返回Collection
Iterator iter3=c.iterator();
while(iter3.hasNext()){
System.out.println(iter3.next());
}
}
}
Iterator iterator():迭代器,集合的专用遍历方式
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Test1 {
public static void main(String[] args) {
// 创建集合对象
Collection c = new ArrayList();
// 创建并添加元素
// String s = "hello";
// c.add(s);
c.add("hello");
c.add("world");
c.add("java");
// Iterator iterator():迭代器,集合的专用遍历方式
Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态
// Object obj = it.next();返回下一个元素,然后跳到下一个,最开始因为本身没有所以返回的是第一个
// System.out.println(obj);
// System.out.println(it.next());//返回下一个元素之后自身跳到下一个等待调用
// System.out.println(it.next());
// System.out.println(it.next());
// System.out.println(it.next());
// 最后一个不应该写,所以,我们应该在每次获取前,如果有一个判断就好了
// 判断是否有下一个元素,有就获取,没有就不搭理它
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// if (it.hasNext()) {
// System.out.println(it.next());
// }
// 最终版代码
while (it.hasNext()) {
// System.out.println(it.next());
String s = (String) it.next();
System.out.println(s);//如果这里输出的是it.next() 就会跳着输出下一个
}
}
}
for 迭代
for(Iterator it = c.iterator();it.hasNext();){
String s = (String) it.next();
System.out.println(s);
}
这种方法的优势在于,循环结束后 Iterator it 就被销毁了,所以比使用while更加节约资源。
迭代器使用问题的探讨:
Iterator iter=list.iterator();//iterator返回的是子类对象,这里是多态
while(iter.hasNext()){
System.out.println("学生姓名:"+((Student)iter.next()).getName());//通过转型在调用getName方法
}
以上这种方法可以通过转型选择性的输出对象的信息,但是需要特别注意的是,输出只能调用一次 next 方法,如果多次调用 ,再次出现next就是下一个对象了。
迭代器的原理
迭代器为什么是一个接口而不是一个类?
如果迭代器是一个类,这样我们就可以创建迭代器的对象,使用该类的方法来事先集合的遍历。但是Java中有不同的集合类,这些类的数据结构也是不同的,所以存储方式和遍历方式也应该是不同的,所以使用将迭代器定义为一个类是不适合的。
无论是哪种集合,都应该具备获取元素的操作,并且最好在辅助与判断功能,这样在获取前先判断更不容易出错,也就是说判断功能和获取功能应该是一个集合所具备的,而每种集合的方式也不太一样,所以我们把这两个功能提取出来并不具体实现,这就是接口。
真正的实现类,在真正具体的子类中,以内部类的方式体现的。
迭代器的源码
public interface Inteator {
boolean hasNext();
Object next();
}
public interface Iterable {
Iterator iterator();
}
public interface Collection extends Iterable {
Iterator iterator();
}
public interface List extends Collection {
Iterator iterator();
}
public class ArrayList implements List {
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {
public boolean hasNext() {}
public Object next(){}
}
}
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator(); //new Itr();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}
Java之集合的遍历与迭代器的更多相关文章
- java关于集合的遍历与增强for循环(foreach)的使用
java集合类的使用可以说是无处不在,总的我们可以将之分为三大块,分别是从Collection接口延伸出的List.Set和以键值对形式作存储的Map类型集合. 许多情况需要我们遍历出集合 ...
- Java自学-集合框架 遍历
遍历ArrayList的三种方法 步骤 1 : 用for循环遍历 通过前面的学习,知道了可以用size()和get()分别得到大小,和获取指定位置的元素,结合for循环就可以遍历出ArrayList的 ...
- Java基础知识强化之集合框架笔记07:Collection集合的遍历之迭代器遍历
1. Collection的迭代器: Iterator iterator():迭代器,集合的专用遍历方式 2. 代码示例: package cn.itcast_03; import java.util ...
- Java 中List 集合索引遍历与迭代器遍历
package yzhou.iterator; import java.util.ArrayList; import java.util.HashSet; import java.util.Itera ...
- JAVA中集合转数组遍历
JAVA中集合的遍历的一种方法时集合转数组遍历,也是就调用Collection中的toArray(). 代码: public static void main(String[] args) { ...
- 对JAVA集合进行遍历删除时务必要用迭代器
java集合遍历删除的方法: 1.当然这种情况也是容易解决,实现方式就是讲遍历与移除操作分离,即在遍历的过程中,将需要移除的数据存放在另外一个集合当中,遍历结束之后,统一移除. 2.使用Iterato ...
- Java 集合-Collection接口和迭代器的实现
2017-10-30 00:30:48 Collection接口 Collection 层次结构 中的根接口.Collection 表示一组对象,这些对象也称为 collection 的元素.一些 c ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- Java集合框架概述和集合的遍历
第三阶段 JAVA常见对象的学习 集合框架概述和集合的遍历 (一) 集合框架的概述 (1) 集合的由来 如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序. 通常,程序 ...
随机推荐
- JS语句
JS语句包括: 1.顺序语句 2.分支语句: if...else switch...case 3.循环语句 一.先看顺序语句: </body> < ...
- php 可变函数
//可变函数 function Test(){ $arr = func_get_args(); //获取所有参数 ,返回数组 $sum=0; for($i ...
- Bash Shell编程要点小结
一.case命令 case variable invalue1) command(s);; value2) command(s);; *) command(s);; esac 如果case变量没有被匹 ...
- 写代码中遇到的问题(php接收不到传过来的json数据,php使用utf8的用法)
今天写代码用python处理完数据,传给php服务器后,发现接收不到数据,因为是跨域,所以加了消息头:header('Access-Control-Allow-Origin:*');但是并没有什么卵用 ...
- iOS 转场动画探究(二)
这篇文章是接着第一篇写的,要是有同行刚看到的话建议从前面第一篇看,这是第一篇的地址:iOS 转场动画探究(一) 接着上一篇写的内容: 上一篇iOS 转场动画探究(一)我们说到了转场要素的第四点,把那个 ...
- input 等替换元素的baseline问题
行内标签和设置为block:inline;形式的标签与input并排放置时,为何会错位?例如下面的. 因为在同一行中,所有行内元素默认 baseline 对齐.但是,input(还有textarea. ...
- 手机cpu结构,arm
问题描述 今天测试人员测试集成版本时除了一个bug:关于华为 Mate 8手机Android 6.0系统运行刚刚提测的版本时,出现闪退的bug,而小米 4 手机Android 6.0系统却没有出现任何 ...
- Thrift总结(二)创建RPC服务
前面介绍了thrift 基础的东西,怎么写thrift 语法规范编写脚本,如何生成相关的语言的接口.不清楚的可以看这个<Thrift总结(一)介绍>.做好之前的准备工作以后,下面就开始如何 ...
- H5学习第三周
今天主要总结弹性布局 flex使用 1.给父容器添加display flex/inline-flex;属性 2.父容器可以使用的属性值有 >>>flex-direction 属性决定 ...
- Building Apps for Windows 10 on LattePanda–Jump Start
1.引言 目前来看,LattePanda应该是最小的运行Full Windows 10系统的开发板了(注意,不是Windows 10 for Mobile,也不是Windows 10 IoT系列,而是 ...