1. List的使用

准备知识:

  List继承自Collection接口。List是一种有序集合,List中的元素可以根据索引(顺序号:元素在集合中处于的位置信息)进行取得/删除/插入操作。
  跟Set集合不同的是,List允许有重复元素。对于满足e1.equals(e2)条件的e1与e2对象元素,可以同时存在于List集合中。当然,也有List的实现类不允许重复元素的存在。
  List还提供一个listIterator()方法,返回一个ListIterator接口对象,和Iterator接口相比,ListIterator添加元素的添加,删除,和设定等方法,还能向前或向后遍历。
  List接口的实现类主要有ArrayList,LinkedList,Vector,Stack等
  LinkedList、ArrayList是非同步的(unsynchronized)。
  如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
  尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。

注意:ArrayList的下标从0开始,如果一个List有4个元素,则list.size()为4;
list中可以添加任何对象,举例:
class Node {
。。。。。
}
上面定义了一个Node类,下面使用List   (我们使用ArrayList)
Node n1 = new Node();
Node n2 = new Node();
List list=new ArrayList();
list.add(n1);
list.add(n2);  //这里是将对象加入到list中
for(int i=0;i<list.size();i++){//利用循环,将Node对象全部一一取出
Node n = (Node)list.get(i);
  //注意,这里一定要强制类型转换,因为List中取出的对象都是Object类型的
}

另一种遍历List的方法

for(String str:list){
System.out.print(str+" ");
}

修改元素的值

ArrayList()中存放的只是对象的引用,如果你将A存到ArrayList(),然后修改A的值,ArrayList()中存放的值就会自动转变。
如果有A的引用可以直接这么写 A.a=你需要的值
如果不知道 可以通过ArrayList().get(indexof(A))取得A的引用,然后修改属性

移除最后一个元素

list.remove(list.size()-1);

或者用下面的Iterator也可(推荐用Iterator)

2. Iterator迭代器的使用

迭代器模式有叫做游标(Cursor)模式。GOF给出的定义:提供一种方法访问一个容器(container)对象中的各个元素,而又不暴露该对象的内部细节。

  (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
  (2) 使用next()获得序列中的下一个元素。
  (3) 使用hasNext()检查序列中是否还有元素。
  (4) 使用remove()将迭代器新返回的元素删除。

注:remove()删除最近一次调用iter.next()获取的容器内部的元素值,如果还未调用过iter.next()则在使用iter.remove()时候报错。

//迭代器的应用
List<String> l1 = new ArrayList<String>();
l1.add("lee");
l1.add("xee");
l1.add("bee");
l1.add("dee"); System.out.println(l1.size()); //输出当前List大小
Iterator it = l1.iterator(); //获取迭代器
it.next(); //获取下一个元素(这里为第一个元素)
it.remove(); //删除上个语句获取的元素
System.out.println(l1.size()); //在此输出List大小 for(Iterator iter = l1.iterator();iter.hasNext();){
String str = (String)iter.next();
System.out.println(str);
}

输出结果

4
3
xee
bee
dee

3. Iterator和Iterable区别

转自:http://perfy315.iteye.com/blog/1459201

java.lang.Iterable
java.util.Iterator

Iterator是迭代器类,而Iterable是接口。好多类都实现了Iterable接口,这样对象就可以调用iterator()方法。一般都是结合着用,比如
HashSet类就实现了Iterable接口,而要访问或打印出Set中所有内容时,就可以这样:

HashSet<String> set = new HashSet<String>();
Iterator itr = set.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}

为什么一定要实现Iterable接口,为什么不直接实现Iterator接口呢?

看一下JDK中的集合类,比如List一族或者Set一族,都是实现了Iterable接口,但并不直接实现Iterator接口。
仔细想一下这么做是有道理的。

因为Iterator接口的核心方法next()或者hasNext() 是依赖于迭代器的当前迭代位置的。
如果Collection直接实现Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
但即时这样,Collection也只能同时存在一个当前迭代位置。
而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
多个迭代器是互不干扰的。

拿一个自定义类为例

Node集成Iterable接口,那么必须实现iterator方法:

class Node implements Iterable{
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return null;
}
}

Node集成Iterator接口,那么必须实现hasNext、next、remove方法

class Node implements Iterator{

    @Override
public boolean hasNext() {
// TODO Auto-generated method stub
return false;
} @Override
public Object next() {
// TODO Auto-generated method stub
return null;
}
@Override
public void remove() {
// TODO Auto-generated method stub
} }

对于Iterable,实现了它的类有 ArrayList, LinkedList, HashSet, TreeSet, Vector, Stack..
所有实现Iterable的类:

All Known Implementing Classes:
AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BatchUpdateException, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedDeque, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DataTruncation, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, RowSetWarning, SerialException, ServiceLoader, SQLClientInfoException, SQLDataException, SQLException, SQLFeatureNotSupportedException, SQLIntegrityConstraintViolationException, SQLInvalidAuthorizationSpecException, SQLNonTransientConnectionException, SQLNonTransientException, SQLRecoverableException, SQLSyntaxErrorException, SQLTimeoutException, SQLTransactionRollbackException, SQLTransientConnectionException, SQLTransientException, SQLWarning, Stack, SyncFactoryException, SynchronousQueue, SyncProviderException, TreeSet, Vector

如何遍历HashMap:http://www.cnblogs.com/meieiem/archive/2011/11/02/2233041.html

Java笔记--Java的List、Iterator用法的更多相关文章

  1. Java 笔记 —— java 和 javac

    Java 笔记 -- java 和 javac h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: ...

  2. java笔记——Java关键字static、final使用小结

    static  1. static变量     按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量:另一种是没有被static修饰的变量,叫实例变量.两者的 ...

  3. Java笔记--java一行一行写入或读取数据

    转自 Ruthless java一行一行写入或读取数据 链接:http://www.cnblogs.com/linjiqin/archive/2011/03/23/1992250.html 假如E:/ ...

  4. java笔记 -- java字符串

    概念: Java字符串就是Unicode字符序列, Java没有内置的字符串类型, 而是在标准Java类库中提供了一个预定义类. 每个用双引号括起来的字符串都是String类的一个实例.String ...

  5. java笔记 -- java变量与常量的声明

    变量: 在Java中, 每一个变量属于一种类型. double salary int vacationDays; long earthPopulation; boolean done; 命名: 以字母 ...

  6. java笔记 -- java数据类型与类型转换

    Java是一种强类型语言, 这就意味着必须为每一个变量声明一种类型. Java中一共有8中基本类型: 4种整型: 整型: 用于表示没有小数部分的数值, 允许为负数 类型 存储需求 取值范围 int: ...

  7. java笔记 -- java简单结构代码解析及注释

    结构代码解析 public class FirstSample { public static void main(String[] args) { System.out.println(2.0-1. ...

  8. Think in Java笔记——Java与对象

    最近在重新学习Java,在阅读Java的经典著作——Java编程思想,因此每天记录阅读的心得. 当听到Java这个词时,大家一般想到的是面向对象,确实Java相对于C/C++这两门语言来说,Java最 ...

  9. java笔记——java加载与执行

    java的加载与执行过程: 编译阶段: 首先,我们先创建一个java源文件xxx.java 2. 经过javac.exe编译(如果源文件没有语法错误),生成一个或多个.class文件,注意的是此时的字 ...

随机推荐

  1. .net core3

  2. ac automaton 专题

    hdu2222 模板题 hdu2825 在ac自动机上的状压dp hdu3247 在ac自动机上bfs poj2778 求长度为n,不包含给定的m个字符串的任何一个的字符串的个数 其实就是求长度为n的 ...

  3. 走进C++程序世界-------类的定义和使用(数据成员和方法成员,析构函数,构造函数,内联实现)

    类的成员简介 在C++中,可以通过声明一个类来穿件一种新的类型.类将一组变量(他们的类型通常不同)和一组相关的函数组合在一起.类可以有各种类型的变量组成,还可以包含其他类对象.成员变量称为数据成员它们 ...

  4. 如何使用git创建项目,创建分支

    git config -global user.name "Your name" git config -global user.email "you@example.c ...

  5. iotop使用

    介绍 Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. iotop 是一个用来监视磁盘 I/O 使用状况 ...

  6. Resty 一款极简的restful轻量级的web框架

    https://github.com/Dreampie/Resty Resty 一款极简的restful轻量级的web框架 开发文档 如果你还不是很了解restful,或者认为restful只是一种规 ...

  7. 如何应对“改变现状”的失败"

    参加工作后,利用闲暇时间看了一些书,发现以上的场景可以通过心理学,神经生物学等相关的知识来解析,同时也可以利用这些知识来进行一些改进.那么下文就来尝试通过心理学来解析这个场景,同时提出一些改进方法. ...

  8. hdu2089:不要62(基础数位dp)

    题意:规定一个合法的号码不能含有4或者是连续的62 给定区间[n,m] 问此区间内合法的号码的个数 分析:数位dp dp[i][j]代表 最高位为 j 的 i 位数有多少个合法的 然后按题目规则进行转 ...

  9. 湖南生第八届大学生程序设计大赛原题 C-Updating a Dictionary(UVA12504 - Updating a Dictionary)

    UVA12504 - Updating a Dictionary 给出两个字符串,以相同的格式表示原字典和更新后的字典.要求找出新字典和旧字典的不同,以规定的格式输出. 算法操作: (1)处理旧字典, ...

  10. hdu 5410 CRB and His Birthday(混合背包)

    Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...