java中常用数据结构之间继承关系和特点

java中常用的数据结构都在java.util包中。

java中文api文档地址(http://www.yq1012.com/api/)

1 . Collection.
实现该接口及其子接口的所有类都可应用clone()方法,并是序列化类.

  • List.
    可随机访问包含的元素
    元素是有序的
    可在任意位置增、删元素
    不管访问多少次,元素位置不变
    允许重复元素
    用Iterator实现单向遍历,也可用ListIterator实现双向遍历

  • ArrayList
    数组作为根本的数据结构来实现List
    元素顺序存储
    新增元素改变List大小时,内部会新建一个数组,在将添加元素前将所有数据拷贝到新数组中
    随机访问很快,删除非头尾元素慢,新增元素慢而且费资源
    较适用于无频繁增删的情况
    比数组效率低,如果不是需要可变数组,可考虑使用数组
    非线程安全

  • Vector.
    另一种ArrayList,具备ArrayList的特性
    所有方法都是线程安全的(双刃剑,和ArrayList的主要区别)
    比ArrayList效率低
    线程安全

  • Stack
    LIFO的数据结构
    Stack继承自Vector,也是同步的

  • LinkedList.
    链接对象数据结构(类似链表)
    随机访问很慢,增删操作很快,不耗费多余资源
    允许null元素
    非线程安全
    如果多个线程同时访问一个List,则必须自己实现访问同步。
        List list = Collections.synchronizedList(new LinkedList(…));

  • Set.
    不允许重复元素的Collection,可以有一个空元素
    不可随机访问包含的元素
    只能用Iterator实现单向遍历
    Set 没有同步方法

  • HashSet
    用HashMap作为根本数据结构来实现Set
    元素是无序的
    迭代访问元素的顺序和加入的顺序不同
    .多次迭代访问,元素的顺序可能不同
    非线程安全

  • LinkedHashSet
    基于HashMap和链表的Set实现
    迭代访问元素的顺序和加入的顺序相同
    多次迭代访问,元素的顺序不变
    因此可说这是一种有序的数据结构
    性能比HashSet差
    非线程安全

  • SortedSet
    加入SortedSet的所有元素必须实现Comparable接口
    元素是有序的

  • TreeSet.
    基于TreeMap实现的SortedSet
    排序后按升序排列元素
    非线程安全

2 . Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。

  • Hashtable.
    用作键的对象必须实现了hashcode()、equals()方法,也就是说只有Object及其子类可用作键
    Hashtable继承于Dictionary字典,实现Map接口
    键、值都不能是空对象
    多次访问,映射元素的顺序相同
    线程安全

  • Properties
    键和值都是字符串

  • HashMap
    键和值都可以是空对象
    不保证映射的顺序
    多次访问,映射元素的顺序可能不同
    非线程安全

    -LinkedHashMap
    多次访问,映射元素的顺序是相同的
    性能比HashMap差

    -WeakHashMap..
    当某个键不再正常使用时,垃圾收集器会移除它,即便有映射关系存在
    非线程安全

  • SortedMap.
    键按升序排列
    所有键都必须实现.Comparable.接口.

  • TreeMap.
    基于红黑树的SortedMap实现
    非线程安全

总结

如果涉及到堆栈、队列等操作,应该考虑用List;

对于需要快速插入,删除元素,应该使用LinkedList;

如果需要快速随机访问元素,应该使用ArrayList。

如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,

如果多个线程可能同时操作一个类,应该使用同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变,这就是针对抽象编程。

你可能感兴趣的:(java,数据结构)