课程咨询 :0592-5903858 QQ:1079585464

厦门达内java培训

厦门Java培训 > 达内新闻 > 达内:Java集合接口及实现类
  • 达内:Java集合接口及实现类

    发布:厦门Java培训      来源:慕课社区      时间:2016-01-07


  •     厦门达内java培训专家介绍Java 集合接口,并讲解接口的实现类,包括 LinkedList、ArrayList、Vector、Stack、Hashtable、HashMap、WeakHashMap 等。

        如何高效、方便地管理对象,对于程序性能与可维护性有重大影响。Java 提供了集合框架来解决此类问题,线性表、链表、哈希表等是常用的数据结构,在进行 Java 开发时,JDK 提供了一系列相应的类来实现基本的数据结构,所有类都在 java.util 这个包里。

        一、集合接口
     
        1、Collection 接口

        Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即 Collection 的元素(Elements)。一些 Collection 允许相同的元素、支持对元素进行排序,另一些则不行。JDK 不提供直接继承自 Collection 的类,JDK 提供的类都是继承自 Collection 的子接口,如 List 和 Set。所有实现 Collection 接口的类都必须提供两个标准的构造函数,无参数的构造函数用于创建一个空的 Collection,有一个 Collection 参数的构造函数用于创建一个新的 Collection,这个新的 Collection 与传入的 Collection 有相同的元素,后一个构造函数允许用户复制一个 Collection。

        如何遍历 Collection 中的每一个元素?

        不论 Collection 的实际类型如何,它都支持一个 iterator() 的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问 Collection 中每一个元素。典型的用法如下:

    Iterator it = collection.iterator(); // 获得一个迭代子
    while(it.hasNext()){
    Object obj = it.next(); // 得到下一个元素
    }

        Collection 接口派生的两个接口是 List 和 Set。

        Collection 接口提供的主要方法:

    boolean add(Object o) 添加对象到集合;
    boolean remove(Object o) 删除指定的对象;
    int size() 返回当前集合中元素的数量;
    boolean contains(Object o) 查找集合中是否有指定的对象;
    boolean isEmpty() 判断集合是否为空;
    Iterator iterator() 返回一个迭代器;
    boolean containsAll(Collection c) 查找集合中是否有集合 C 中的元素;
    boolean addAll(Collection c) 将集合 C 中所有的元素添加给该集合;
    void clear() 删除集合中所有元素;
    void removeAll(Collection c) 从集合中删除 C 集合中也有的元素;
    void retainAll(Collection c) 从集合中删除集合 C 中不包含的元素。

        2、List 接口

        List 是有序的 Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引来访问 List 中的元素,这类似于 Java 的数组。List 允许有相同的元素。

        除了具有 Collection 接口必备的 iterator() 方法外,List 还提供一个 listIterator() 方法,返回一个 ListIterator 接口。和标准的 Iterator 接口相比,ListIterator 多了一些 add() 之类的方法,允许添加、删除、设定元素、向前或向后遍历等功能。实现 List 接口的常用类有 LinkedList,ArrayList,Vector 和 Stack 等。

        List 接口提供的主要方法:

    void add(int index,Object element) 在指定位置上添加一个对象;
    boolean addAll(int index,Collection c) 将集合 C 的元素添加到指定的位置;
    Object get(int index) 返回 List 中指定位置的元素;
    int indexOf(Object o) 返回第一个出现元素 O 的位置;
    Object removeint(int index) 删除指定位置的元素;
    Object set(int index,Object element) 用元素 element 取代位置 index 上的元素,返回被取代的元素。

        3、Map 接口

        Map 没有继承 Collection 接口。Map 提供 Key 到 Value 的映射,一个 Map 中不能包含相同的 Key,每个 Key 只能映射一个 Value。Map 接口提供 3 种集合的视图,Map 的内容可以被当作一组 Key 集合,一组 Value 集合,或者一组 Key-Value 映射。

        Map 提供的主要方法:

    boolean equals(Object o) 比较对象;
    boolean remove(Object o) 删除一个对象;
    put(Object key,Object value) 添加 key 和 value。

        4、RandomAccess 接口

        RandomAccess 接口是一个标志接口,本身并没有提供任何方法,任务凡是通过调用 RandomAccess 接口的对象都可以认为是支持快速随机访问的对象。此接口的主要目的是标识那些可支持快速随机访问的 List 实现。任何一个基于数组的 List 实现都实现了 RaodomAccess 接口,而基于链表的实现则都没有。因为只有数组能够进行快速的随机访问,而对链表的随机访问需要进行链表的遍历。因此,此接口的好处是,可以在应用程序中知道正在处理的 List 对象是否可以进行快速随机访问,从而针对不同的 List 进行不同的操作,以提高程序的性能。

        二、集合类介绍
     
        1、LinkedList 类

        LinkedList 实现了 List 接口,允许 Null 元素。此外 LinkedList 提供额外的 Get、Remove、Insert 等方法在 LinkedList 的首部或尾部操作数据。这些操作使得 LinkedList 可被用作堆栈(Stack)、队列(Queue)或双向队列(Deque)。 LinkedList 没有同步方法,它不是线程同步的,即如果多个线程同时访问一个 List,则必须自己实现访问同步。一种解决方法是在创建 List 时构造一个同步的 List,方法如

    List list = Collections.synchronizedList(new LinkedList(...));

        2、ArrayList 类

        ArrayList 实现了可变大小的数组。它允许所有元素,包括 Null。Size、IsEmpty、Get、Set 等方法的运行时间为常数,但是 Add 方法开销为分摊的常数,添加 N 个元素需要 O(N) 的时间,其他的方法运行时间为线性。

        每个 ArrayList 实例都有一个容量(Capacity),用于存储元素的数组的大小,这个容量可随着不断添加新元素而自动增加。当需要插入大量元素时,在插入前可以调用 ensureCapacity 方法来增加 ArrayList 的容量以提高插入效率。和 LinkedList 一样,ArrayList 也是线程非同步的(unsynchronized)。

        ArrayList 提供的主要方法:

    Boolean add(Object o) 将指定元素添加到列表的末尾;
    Boolean add(int index,Object element) 在列表中指定位置加入指定元素;
    Boolean addAll(Collection c) 将指定集合添加到列表末尾;
    Boolean addAll(int index,Collection c) 在列表中指定位置加入指定集合;
    Boolean clear() 删除列表中所有元素;
    Boolean clone() 返回该列表实例的一个拷贝;
    Boolean contains(Object o) 判断列表中是否包含元素;
    Boolean ensureCapacity(int m) 增加列表的容量,如果必须,该列表能够容纳 m 个元素;
    Object get(int index) 返回列表中指定位置的元素;
    Int indexOf(Object elem) 在列表中查找指定元素的下标;
    Int size() 返回当前列表的元素个数。

        3、Vector 类

        Vector 非常类似于 ArrayList,区别是 Vector 是线程同步的。由 Vector 创建的 Iterator,虽然和 ArrayList 创建的 Iterator 是同一接口,但是,因为 Vector 是同步的,当一个 Iterator 被创建而且正在被使用,另一个线程改变了 Vector 的状态,这时调用 Iterator 的方法时将抛出 ConcurrentModificationException,因此必须捕获该异常。

        4、Stack 类

        Stack 继承自 Vector,实现了一个后进先出的堆栈。Stack 提供 5 个额外的方法使得 Vector 得以被当作堆栈使用。除了基本的 Push 和 Pop 方法,还有 Peek 方法得到栈顶的元素,Empty 方法测试堆栈是否为空,Search 方法检测一个元素在堆栈中的位置。注意,Stack 刚创建后是空栈。

        5、Set 类

        Set 是一种不包含重复的元素的 Collection,即任意的两个元素 e1 和 e2 都有 e1.equals(e2)=false。Set 最多有一个 null 元素。Set 的构造函数有一个约束条件,传入的 Collection 参数不能包含重复的元素。必须小心操作可变对象(Mutable Object),如果一个 Set 中的可变元素改变了自身状态,这可能会导致一些问题。

        6、Hashtable 类

        Hashtable 继承 Map 接口,实现了一个基于 Key-Value 映射的哈希表。任何非空(non-null)的对象都可作为 Key 或者 Value。添加数据使用 Put(Key,Value),取出数据使用 Get(Key),这两个基本操作的时间开销为常数。

        Hashtable 通过 Initial Capacity 和 Load Factor 两个参数调整性能。通常缺省的 Load Factor 0.75 较好地实现了时间和空间的均衡。增大 Load Factor 可以节省空间但相应的查找时间将增大,会影响像 Get 和 Put 这样的操作。使用 Hashtable 的简单示例,将 1、2、3 这三个数字放到 Hashtable 里面,他们的 Key 分别是”one”、”two”、”three”,

        由于作为 Key 的对象将通过计算其散列函数来确定与之对应的 Value 的位置,因此任何作为 key 的对象都必须实现 HashCode 和 Equals 方法。HashCode 和 Equals 方法继承自根类 Object,如果你用自定义的类当作 Key 的话,要相当小心,按照散列函数的定义,如果两个对象相同,即 obj1.equals(obj2)=true,则它们的 HashCode 必须相同,但如果两个对象不同,则它们的 HashCode 不一定不同,如果两个不同对象的 HashCode 相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的 HashCode() 方法,能加快哈希表的操作。

        如果相同的对象有不同的 HashCode,对哈希表的操作会出现意想不到的结果(期待的 Get 方法返回 Null),要避免这种问题,最好同时复写 Equals 方法和 HashCode 方法,而不要只写其中一个。

        7、HashMap 类

        HashMap 和 Hashtable 类似,不同之处在于 HashMap 是线程非同步的,并且允许 Null,即 Null Value 和 Null Key。但是将 HashMap 视为 Collection 时(values() 方法可返回 Collection),其迭代子操作时间开销和 HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将 HashMap 的初始化容量设得过高,或者 Load Factor 参数设置过低。

        8、WeakHashMap 类

    WeakHashMap 是一种改进的 HashMap,它对 Key 实行“弱引用”,如果一个 Key 不再被外部所引用,那么该 Key 可以被 GC 回收。








    原文链接:http://www.imooc.com/article/3441
    推荐文章

上一篇:达内:Java高级特性——反射

下一篇:达内:如何计算java对象占用空间

最新开班日期  |  更多

Java--大数据周末班

Java--大数据周末班

开班日期:每周一

Java--大数据全日制班

Java--大数据全日制班

开班日期:每周一

Java--零基础周末班

Java--零基础周末班

开班日期:每周一

Java--零基础全日制班

Java--零基础全日制班

开班日期:每周一

  • 地址:厦门软件园二期望海路59号之一401达内科技
  • 课程培训电话:0592-5903858 QQ:1079585464     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56