一.集合的接口

java集合类库也将接口与实现相分离。首先看一下大家都熟悉的数据结构-队列是如何分离的。队列接口指出可以在队列的尾部添加元素,在队列的头部删除元素,并且可以查找队列中元素的个数。当需要收集对象,并按照“先进先出”的规则检索对象时就应该使用队列。

队列通常有两种实现方式:循环数组 和 链表。循环数组查询数据的效率比链表高,但是增加和删除元素的速度没链表快。并且循环数组是一个有界集合,即容量有限,如果程序中要收集的对象数量没有上限,就最好使用链表来实现。

在Java类库中,集合类的基本接口是Collection接口,这个接口有两个基本方法:

 public interface Collection<E>
 {
     boolean add(E element);
     Iterator<E> iterator();
     ...
 }       

add方法用于往集合中添加元素。如果添加元素确实改变了集合就返回true,如果集合没有改变就返回false。注意,如果视图往集中添加一个元素,而这个对象在集中已经存在,这个添加请求就没有实效,因为集中不允许有重复的对象,返回false。

iterator方法用于返回一个实现了Iterator接口的对象。可以使用迭代器依次访问集合中的元素。

1.迭代器

Iterator接口包含3个方法:

 public interface Iterator<E>
 {
     E next();
     boolean hasNext();
     void remove();
 }

通过反复调用next方法,可以逐个访问集合中的每个元素。但是如果达到了集合的末尾,next方法将会抛出一个NoSuchElementException。因此在调用next之前调用hasNext方法。

元素被访问的顺序取决于集合类型。如果对ArrayList等有序集合迭代,迭代器将从索引0开始,依次往下。如果访问HashSet等无序集合的元素,每个元素将会按照某种随机的次序出现。虽然可以确定在迭代过程中能够遍历到集合中所有的集合元素,但却无法预知元素被访问的次序。

注意:java集合类库中的迭代器与其他类库中的迭代器在概念上有重要的区别。在传统的类库中,比如C++的标准模版库,迭代器是根据数组索引建模的。这样的话,就可以根据数组索引i来查看数组元素a[i]。但是java迭代器不是这样操作,它查找一个元素的唯一方法是调用next,而在执行查找操作的同时,迭代器的位置随之向前移动。

因此,应该将java迭代器默认为位于两个元素之间。当调用next时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。

2.删除元素

Iterator接口的remove方法将会删除上次调用next方法时返回的元素。即使想要删除指定位置上的元素,仍然要越过这个元素。更重要的是,对next和remove方法的调用具有相互依赖性。如果调用remove之前没有调用next将是不合法的。如果这样做,会抛出一个IllegalStateException异常。

3.泛型实用方法

由于Collection和Iterator都是泛型接口,可以编写操作任何集合类型的实用方法。下面是一个用于检测集合是否包含指定元素的泛型方法:

 public static <E> boolean contains(Collection<E> c,Object obj)
 {
     for(E element : c)
         if(element.equals(obj))
             return true;
     return false;
 }

事实上,Collection接口声明了很多有用的方法,所有的实现类都必须提供这些方法。比如:

int size();

boolean isEmpty();

  boolean contains(Object obj);

  boolean containsAll(Collection<?> c);

  boolean equals(Object obj)

  boolean addAll(Collection<? extends E> from)

  boolean remove(Object obj)

  boolean removeAll(Collection<?> c)

  void clear();

  boolean retainAll(Collection<?> c)

Java类库提供了一个类AbstractCollection。一个具体的集合类可以扩展AbstractCollection。

java集合类学习笔记1的更多相关文章

  1. java集合类学习笔记之HashMap

    1.简述 HashMap是java语言中非常典型的数据结构,也是我们平常用的最多的的集合类之一.它的底层是通过一个单向链表(Node<k,v>)数组(也称之为桶bucket,数组的长度也叫 ...

  2. java集合类学习笔记之LinkedHashMap

    1.简述 LinkedHashMap是HashMap的子类,他们最大的不同是,HashMap内部维护的是一个单向的链表数组,而LinkedHashMap内部维护的是一个双向的链表数组.HashMap是 ...

  3. java集合类学习笔记之ArrayList

    1.简述 ArrayList底层的实现是使用了数组保存所有的数据,所有的操作本质上是对数组的操作,每一个ArrayList实例都有一个默认的容量(数组的大小,默认是10),随着 对ArrayList不 ...

  4. Java集合类学习笔记(Set集合)

    Set集合不允许包含相同的元素,如果试图把两个相同的元素加入同一个Set集合中,则添加操作失败,add()方法返回false,且新元素不会被加入. HashSet类的特点: 不能保证元素的排列顺序,顺 ...

  5. Java集合类学习笔记2

    二,具体的集合 集合类型 描述 ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效地插入和删除操作的有序序列 ArrayDeque 一种用循环数组实 ...

  6. Java集合类学习笔记(各种Map实现类的性能分析)

    HashMap和Hashtable的实现机制几乎一样,但由于Hashtable是一个古老的.线程安全的集合,因此HashMap通常比Hashtable要快. TreeMap比HashMap和Hasht ...

  7. Java集合类学习笔记(Map集合)

    Map用于保存具有映射关系的数据,因此Map集合里保存着两组数据,一组用于保存Map的key,一组用于保存key所对应的value. Map的key不允许重复. HashMap和Hashtable都是 ...

  8. Java集合类学习笔记(各种线性表性能分析)

    ArrayList.LinkedList是线性表的两种典型实现:基于数组的线性表和基于链的线性表. Queue代表了队列,Deque代表了双端队列. 一般来说,由于数组以一块连续内存区来保存所有的数组 ...

  9. Java集合类学习笔记(Queue集合)

    Queue集合用于模拟队列(先进先出:FIFO)这种数据类型. Queue有一个Deque接口,代表一个"双端队列",双端队列可以同时从两端来添加.删除元素,因此Deque的实现类 ...

随机推荐

  1. Hadoop wordcount Demon

    搭建完成Hadoop后,第一个demon,wordcount.此处参考:http://blog.csdn.net/wangjia55/article/details/53160679 wordcoun ...

  2. Gym 101606 - A/B/C/D/E/F/G/H/I/J/K/L - (Undone)

    链接:https://codeforces.com/gym/101606 A - Alien Sunset 暴力枚举小时即可. #include<bits/stdc++.h> using ...

  3. 寻找真正的入口(OEP)--广义ESP定律

    1.前言 在论坛上看到很多朋友,不知道什么是ESP定律,ESP的适用范围是什么,ESP定律的原理是什么,如何使用ESP定律?看到了我在“”调查结果发现,大家对ESP定律很感兴趣,当然因为实在是太好用了 ...

  4. VS2015调试ArcMap Add-in插件提示尝试运行项目时出错,无法启动程序“路径\arcmap.exe”

    如图所示的错误: 打开VS2015→工具→选项→常规→如图标记的两项打钩: 参考: https://gis.stackovernet.com/cn/q/40845 http://www.voidcn. ...

  5. mysql 外键约束及表关联

    一.MYSQL中的约束 1.主键:primary key 唯一非空的特性并且可以优化查询速度 2.外键:foreign key 外键的作用保证2个或2个以上的数据表的数据一致性和完整性 3.唯一:un ...

  6. studio-3t 配置文件位置

    换电脑了,原来的studio-3t的配置 在 C:\Users\用户名\.3T. 将这个目录下的所有文件拷贝到 新电脑里的 相同文件夹,覆盖即可

  7. 806. Number of Lines To Write String

    806. Number of Lines To Write String 整体思路: 先得到一个res = {a : 80 , b : 10, c : 20.....的key-value对象}(目的是 ...

  8. [ML] 数据处理

    可以不需要自己开发,使用CloudCompare的分割合并功能实现点云标注(labeling),生成点云训练集数据. (1)首先对点云中的物体进行分割,分割出一个一个的类别. (2)接着删除所有的SF ...

  9. 白话skynet第二篇:skynet的通信调试pack和sprotol

    今天来说说Skynet客户端和服务端网络通信的基础部分. Skynet当前版本.lua是skynet自带的5.3版本. 根据示例,我们可以知道.通信的步骤如下. 客户端按大小端打包成二进制. sock ...

  10. python的高级数组之稀疏矩阵

    稀疏矩阵的定义: 具有少量非零项的矩阵(在矩阵中,若数值0的元素数目远多于非0元素的数目,并且非0元素分布没有规律时,)则称该矩阵为稀疏矩阵:相反,为稠密矩阵.非零元素的总数比上矩阵所有元素的总数为矩 ...