• 技术文章 >Java >java教程

    Java集合之Collection具体详解

    黄舟黄舟2017-03-13 17:28:29原创1016

    Java集合是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。Java集合工具包位置是java.util.*

    Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections)。

    Java集合框架如下图:


    由上图可以看到Java框架主要是Collection和Map。

    一、Collection是一个接口,是一个高度抽象出来的集合,接口包含了基本操作和属性

    Collection包含了List和Set两大分支:

    1)、List是一个有序的队列,每一个元素都有它的索引,第一个元素的索引值是0。List的实现类有LinkedList、ArrayList、Vector和Stack。

    (1)、LinkedList实现了List接口,允许元素为空,LinkedList提供了额外的get,remove,insert方法,这些操作可以使LinkedList被用作堆栈、队列或双向队列。

    LinkedList并不是线程安全的,如果多个线程同时访问LinkedList,则必须自己实现访问同步,或者另外一种解决方法是在创建List时构造一个同步的List。

    (2)、ArrayList 实现了可变大小的数组,允许所有元素包括null,同时ArrayList也不是线程安全的。

    (3)、Vector类似于ArrayList,但Vector是线程安全的。

    (4)、Stack继承自Vector,实现一个后进先出的堆栈。

    Vector、ArrayLis和LinkedList比较:

    (1)Vector是线程安全的,ArrayList和LinkedList不是线程安全的,但一般不考虑线程安全因素,ArrayList和LinkedList效率比较高。

    (2)ArrayList和Vector是实现了基于动态数组的数据结构而LinkedList是基于链表的数据结构。

    (3)数组和链表的查询,删除等的性能。


    2)、set是一个不允许有重复元素的集合。set的实现类有Hashset和Treeset。HashSet依赖于HashMap,实际上是通过HashMap实现的;TreeSet依赖于TreeMap,通过TreeMap来实现的。

    二、Map是一个映射接口,采用key-value键值对的方式。

    AbstractMap是一个抽象类,它实现了Map接口中的大部分API,而HashMap、TreeMap和WeakHashMap都是继承于AbstractMap,HashTable虽然继承于Dictionary,但它实现了Map接口。


    1)、HashTable

    (1)HashTable继承Map接口,实现一个key-value映射的哈希表,任何非空的对象都可作为key或者value。

    (2)添加数据put和取出数据get两个操作的时间开销为常数。

    (3)由于作为key的对象是通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须要实现hashCode和equals方法。hashCode和equals方法都是继承自根类Object

    (4)HashTable是线程安全的。


    2)、HashMap

    (1)HashMap和HashTable类似,但HashMap是非线程安全的,且允许key和value都为空。

    (2)将HashMap视为Collection时,其迭代操作时间开销和HashMap的容量成正比,如果迭代性能的操作相当重要的话,不要将HashMap的初始化容量舍得过高。


    3)、TreeMap

    (1)HashMap通过Hashcode对其内容进行快速查找,无序的,而TreeMap中所有的元素都保持着某种固定的顺序,有序的。

    (2)TreeMap没有调优选项,因为该树总是处于平衡状态。


    4)、WeakHashMap

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

    总结

    (1)如果涉及到堆栈,队列等操作,应该考虑用List;对于需要快速插入,删除元素,应该使用LinkedList;如果需要快速随机访问元素,应该使用ArrayList。

    (2)如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高;如果多个线程可能同时操作一个类,应该使用同步的类。

    (3)要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。

    (4)使用Map时,查找、更新、删除、新增最好使用HashMap或HashTable;对Map进行自然顺序或自定义键顺序遍历时,最好使用TreeMap;

    (5)尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。


    Collection接口源码

    public interface Collection<E> extends Iterable<E> {
        int size(); //大小
        boolean isEmpty();//是否为空
        boolean contains(Object o); //是否包含某个对象
        Iterator<E> iterator(); //迭代
        Object[] toArray(); //转化为数组
        <T> T[] toArray(T[] a);
        boolean add(E e); //增加对象
        boolean remove(Object o); //删除对象
        boolean containsAll(Collection<?> c); //判断是否包含相同的Collection
        boolean addAll(Collection<? extends E> c); //将Collection追加到
        boolean removeAll(Collection<?> c); //删除所有相同对象
        default boolean removeIf(Predicate<? super E> filter) {
            Objects.requireNonNull(filter);
            boolean removed = false;
            final Iterator<E> each = iterator();
            while (each.hasNext()) {
                if (filter.test(each.next())) {
                    each.remove();
                    removed = true;
                }
            }
            return removed;
        }
        boolean retainAll(Collection<?> c);
        void clear();
        boolean equals(Object o);
        int hashCode();
        @Override
        default Spliterator<E> spliterator() {
            return Spliterators.spliterator(this, 0);
        }
        default Stream<E> stream() {
            return StreamSupport.stream(spliterator(), false);
        }
        default Stream<E> parallelStream() {
            return StreamSupport.stream(spliterator(), true);
        }
    }

    以上就是Java集合之Collection具体详解的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:Java,Collection
    上一篇:Java集合之List代码分析 下一篇:Java 通过位运算求一个集合的所有子集的实现方法详解
    千万级数据并发解决方案

    相关文章推荐

    • 快速上手Java数据结构之字符串• java知识点详解之注解与元注解• 一起来分析java是值传递还是引用传递• 详细整理java枚举的使用总结• 带你搞懂JAVA反射机制(总结分享)
    1/1

    PHP中文网