Java集合框架(Collections Framework)(3)

例如,获取coll中为Student对象元素的name属性,并删除非Student对象的元素。

Collection coll = new ArrayList(); coll.add("abcd"); coll.add(new Integer(129)); coll.add(new Student("Gaoxiaofang",23)); for (Iterator it = coll.iterator();it.hasNext();) { Object obj = it.next(); if (obj instanceof Student) { Student s = (Student)obj; System.out.println(s.getName()); //return: Gaoxiaofang } else { it.remove(); } } System.out.println(coll); //return: [Gaoxiaofang 23]

因为集合中有些非Student对象元素,因此需要判断it.next()是否满足instanceof的要求,但不能直接写为下面的代码:

for (Iterator it = coll.iterator();it.hasNext();) { if (it.next() instanceof Student) { Student s = (Student)it.next(); System.out.println(s.getName()); } }

因为每执行一次it.next(),元素的游标指针就向下滑动1,在这个写法中if判断表达式中使用了一次it.next(),在if的代码块中又调用了一次it.next()。所以应该将it.next()保存到对象变量中。而it.next()返回的类型是Object类型,因此定义Object obj = it.next()。

只有remove()方法是Iterator迭代器迭代过程中修改集合元素且安全的方法。以迭代时add()为例,当开始迭代时,迭代器线程获取到集合中元素的个数,当迭代过程中执行add()时,它将采用另一个线程来执行(因为add()方法不是Iterator接口提供的方法),结果是元素个数就增加了,且导致新增的元素无法确定是否应该作为迭代的一个元素。这是不安全的行为,因此会抛出ConcurrentModificationException异常。而remove()方法是迭代器自身的方法,它会使用迭代器线程来执行,因此它是安全的。

对于List类的集合来说,可以使用Iterator的子接口ListIterator来实现安全的迭代,该接口提供了不少增删改查List类集合的方法。

List接口

List接口实现了Collection接口。

List接口的数据结构特性是:

1.有序列表,且带索引index。所谓有序指先后插入的顺序,即Index决定顺序。而向Set集合中插入数据会被打乱

2.大小可变。

3.数据可重复。

4.因为有序和大小可变,使得它除了有Collection的特性,还有根据index精确增删改查某个元素的能力。

5.实现List接口的两个常用类为:

(1).ArrayList:数组结构的有序列表;

1).长度可变,可变的原因是在减少或添加元素时部分下标整体减一或加一,如果已分配数组空间不够,则新创建一个更大的数组,并拷贝原数组的内存(直接内存拷贝速度极快);

2).查询速度快,增删速度慢。查询快是因为内存空间连续,增删速度慢是因为下标移动。

3).除了ArrayList是不同步列表,它几乎替代了Vector类。

(2).LinkedList:链表结构的有序列表;

1).不同步;

2).增删速度快,查询速度慢。增删速度快的原因是只需修改下链表中前后两个元素的索引指向即可;

3).能够实现堆栈(后进先出LIFO,last in first out)、队列(queue,通常是FIFO,first in first out)和双端队列(double ends queue)。

ArrayList类的方法和List方法基本一致,所以下面介绍了List通用方法和ListIterator就没必要介绍ArrayList。但LinkedList比较特殊,所以独立介绍。

List接口通用方法

除了因为继承了Collection而具有的通用方法外,对于List接口也有它自己的通用方法。一般List的这些通用方法针对的是序列的概念。有了序列和下标索引值,可以精确地操控某个位置的元素,包括增删改查。

(1).增:add(index,element)

(2).删:remove(index)、remove(obj)删除列表中第一个obj元素

(3).改:set(index,element)

(4).查:get(index)

(5).indexOf(obj):返回列表中第一次出现obj元素的索引值,如不存在则返回-1

(6).lastIndexOf(obj)

(7).subList(start,end):返回列表中从start到end(不包括end边界)中间的元素组成列表。注意返回的是List类型。

(8).listIterator():返回从头开始遍历的List类集合的迭代器ListIterator。

(9).listIterator(index):返回从index位置开始遍历的List结合迭代器ListIterator。

因为有了get()方法,除了Iterator迭代方式,还可以使用get()方法遍历集合:

List l = new ArrayList(); for (int i=0;i<l.size();i++) { System.out.println(l.get(i)); }

但注意,这种方法不安全,因为l.size()是即时改变的,如果增删了元素,size()也会随之改变。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/349b058e608364c69d6a7c8d05332c22.html