java集合(一)——数据结构详解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java集合(一)——数据结构详解(一)集合接口

1.集合的接口和实现分离

与其他的数据结构类库相似的,java的集合类库也采用了这种接口和实现分离的方法。

这种方法的好处是不言而喻的。当你要实例化一个队列时,如果你想去选择链式结构或者循环数组或其他不同的实现方法,只需为集合接口引用不同的实现类即可。

Queue qe1 = new LinkedList<>();//LinkedList是链表实现队列

Queue qe2 = new ArrayDeque<>();//ArrayDeque是循环数组实现队列

同样是Queue的实现类,但采用了不同的方式。

2.Collection接口

在集合类库中,最基本的接口是Collection接口。

Collection接口可以理解成集合类库中的树根,所有的其他类都是从之演变出来的。因为Colleaction是一个泛型接口,所以在这个泛型接口中java类库的设计者添加了许多的方法,所有的实现类都必须去实现这些方法。

int size()

//返回此collection 中的元素数。

//如果此collection 包含的元素大于Integer.MAX_V ALUE,则返回Integer.MAX_V ALUE。

boolean isEmpty()

//如果此collection 不包含元素,则返回true。

boolean contains(Object o)

//当且仅当此collection 至少包含一个满足(o==null ? e==null : o.equals(e)) 的元素e 时,返回true。

Iterator iterator()

//返回在此collection 的元素上进行迭代的迭代器。

//关于元素返回的顺序没有任何保证,除非此collection 是某个能提供保证顺序的类实例。

Object[] toArray()

//返回包含此collection 中所有元素的数组。

//如果collection 对其迭代器返回的元素顺序做出了某些保证,那么此方法必须以相同的顺序返回这些元素。

//返回的数组将是“安全的”,因为此collection 并不维护对返回数组的任何引用。

//调用者可以随意修改返回的数组。

//此方法充当了基于数组的API 与基于collection 的API 之间的桥梁。

boolean add(E e)

//确保此collection 包含指定的元素。如果此collection 由于调用而发生更改,则返回true。//如果此collection 不允许有重复元素,并且已经包含了指定的元素,则返回false。

boolean remove(Object o)

//如果此collection 包含一个或多个满足(o==null ? e==null : o.equals(e)) 的元素e,则移除这样的元素。

//如果此collection 包含指定的元素(或者此collection 由于调用而发生更改),则返回true 。

boolean containsAll(Collection c)

//如果此collection 包含指定collection 中的所有元素,则返回true。

boolean addAll(Collection c)

//将指定collection 中的所有元素都添加到此collection 中。

//如果在进行此操作的同时修改指定的collection,那么此操作行为是不确定的。

boolean removeAll(Collection c)

//移除此collection 中那些也包含在指定collection 中的所有元素。

//此调用返回后,collection 中将不包含任何与指定collection 相同的元素。

void clear()

//移除此collection 中的所有元素。

boolean retainAll(Collection c)

//仅保留此collection 中那些也包含在指定collection 的元素。

//移除此collection 中未包含在指定collection 中的所有元素。

以上这些方法将会在所有的集合数据结构中出现,记住他们的作用,无论是哪个数据结构,只要调用他们准没有错。除此之外真的要赞叹Java API编写者的水平,方法功能的介绍用最少的语言来说的滴水不漏,这种超强的概括性,水平之高可见一斑。尤其像remove中判断的方式,书写简洁美观,包含存在null的情况,真的是非常值得学习。(特殊的,表不是从Collection接口实现的,而是Map接口)

(二)Iterator

在创建Collection接口的同时,集合类库也创建了Iterator接口,这个接口的对象是一个迭代器,他会依次遍历集合中所有的元素。在开始的时候,如果集合是有序的,那么通过Collection接口的iterator方法返回的迭代器对象会在集合起始位置。

Iterator it = new Iterator<>();

Iterator it = queue.iterator();//通过队列中实现的iterator方法返回迭代器

Iterator对象工作的原理是把每个集合中的对象看作一个块,it在这些块之间跳跃。在开始的时候it在第一个块前(如果是有序集),调用一次next()方法it就会跳到下个块之后,并且跳完之后返回在it前面的块。如果在开始直接it.remove()会报错,因为remove的原理是删除在it之前的这个块,所以需要先进行next()操作。同理,连续remove两次也是会报错的。

Queue qe1 = new LinkedList<>();

qe1.add(null);

qe1.add(1);

qe1.add(20);

System.out.println(qe1);

Iterator it = qe1.iterator();

//-------------error-------------

it.reomve(); //不能直接调用remove(),这时it没有跳过块,it之前没有内容

//-------------------------------

//-------------error-------------

it.next();

it.remove();

it.reomve(); //不能连续调用remove(),it之前的块已被删除,再调用报错

//-------------------------------

//--------------ok---------------

it.next();

it.remove();

it.next();

it.remove();

//-------------------------------

System.out.println(qe1);

//输出:

//[20]

上面的例子中值得注意的一点是qe1.add(null);是完全成立的。基本上所有的集合可以显式的把null作为一个对象传入(除了特殊的集合,比如PriorityQueue…等)。这样我们也就可以理解API中的:

if(o==null ? e==null : o.equals(e)) //如果集合中有和o相同的e

相关文档
最新文档