Java中的数据结构一览

Java的类库实在是很多,以至于很多人都不太了解,结果总是自己造轮子。

下面汇总了Java中的一些数据结构,加上一些实现的分析,同时备忘。

至于时间复杂度,个人觉得写出来的用处不大。如果明白它是怎么实现的,那自然就知道它的时间复杂度。

如果不理解它的实现,把时间复杂度背得再熟也没用。

接口:

Collection<E>

子接口:

BlockingDeque<E>, BlockingQueue<E>, Deque<E>, List<E>, NavigableSet<E>, Queue<E>, Set<E>, SortedSet<E> 

实现类:

ArrayBlockingQueue, ArrayDeque, ArrayList,  ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, PriorityBlockingQueue, PriorityQueue, Stack, SynchronousQueue, TreeSet, Vector 

List<E>

实现类:

ArrayList, CopyOnWriteArrayList, LinkedList,Stack, Vector 

Queue<E>

子接口:

BlockingDeque<E>, BlockingQueue<E>, Deque<E> 

实现类:

ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, SynchronousQueue 

Set<E>

子接口:

NavigableSet<E>, SortedSet<E> 

实现类:

ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, LinkedHashSet, TreeSet 

Map<K,V>

子接口:

ConcurrentMap<K,V>, ConcurrentNavigableMap<K,V>,  SortedMap<K,V> 

实现类:

ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, HashMap, Hashtable, IdentityHashMap, LinkedHashMap, TreeMap, WeakHashMap 

并发与线程安全等

通常含有Concurrent,CopyOnWrite,Blocking的是线程安全的,但是这些线程安全通常是有条件的,所以在使用前一定要仔细阅读文档。

具体实现:

List<E>系列:

ArrayList<E>,如其名,但是其容量增长计划是newCapacity = (oldCapacity * 3)/2 + 1,和C++通常的Vector是翻倍的策略不同。

CopyOnWriteArrayList<E>,里面有一个ReentrantLock,每当add时,都锁住,把所有的元素都复制到一个新的数组上。

只保证历遍操作是线程安全的,get操作并不保证,也就是说如果先得到size,再调用get(size-1),有可能会失效

那么CopyOnWriteArrayList是如何实现线程安全的迭代操作?

在迭代器中保存原数组。

LinkedList<E>,标准双向链表

Vector<E>,过时,多数方法上加上了synchronized

Stack<E>,继承自Vector,过时,优先应使用 Deque<Integer> stack = new ArrayDeque<Integer>();

Queue<E>系列:

LinkedList<E>,见List<E>系列

ArrayDeque<E>,内部用一个数组保存元素,有int类型head和tail的。

PriorityQueue<E>,内部用一个数组来保存元素,但数组是以堆的形式来组织的,因此是有序的。

PriorityBlockingQueue<E>,包装了一个PriorityQueue<E>,一个ReentrantLock,一个Condition,TODO

ArrayBlockingQueue<E>,TODO

ConcurrentLinkedQueue<E>,TODO

DelayQueue<E>,TODO

LinkedBlockingDeque<E>,TODO

LinkedBlockingQueue<E>,TODO

SynchronousQueue<E>,TODO

Deque<E>(双端队列)系列:

ArrayDeque<E>,见Queue系列

LinkedList<E>,见List系列

LinkedBlockingDeque<E>,TODO

Set系列:

HashSet,包装了一个HashMap:

    public HashSet() {

        map = new HashMap<E,Object>();

    }

TreeSet,包装了一个TreeMap,参考HashSet

LinkedHashSet,包装了LinkedHashMap,参考HashSet

EnumSet,TODO

CopyOnWriteArraySet,简单包装了CopyOnWriteArrayList,注意这个Set的get的时间复杂度。

ConcurrentSkipListSet,包装了一个ConcurrentSkipListMap,参考HashSet。

Map系列:

HashMap<K,V>,标准链地址法实现

TreeMap<K,V>,红黑二叉树

LinkedHashMap<K,V>,在Entry中增加before和after指针把HashMap中的元素串联起来,这样在迭代时,就可以按插入顺序历遍。

EnumMap,TODO

ConcurrentHashMap,参考之前的文章

ConcurrentSkipListMap,TODO,log(n)的时间复杂度,有点像多级链表保存的,貌似有点像redis中的SortedSet的实现

Hashtable,过时

IdentityHashMap,正常的HashMap中比较是用equals方法,这个用的是“==”比较符

WeakHashMap<K,V>,弱引用的HashMap,正常的HashMap是强引用,即里面的value不会被GC回收,在WeakHashMap<K,V>中,V中最好是WeakReference类型的,用像这样的代码:m.put(key, new WeakReference(value))。

其它的一些实用的第三方的数据结构:

LRUCache,LongHashMap,Java7中的LinkedTransferQueue,

Apache的包,里面有很多实用的类:

http://commons.apache.org/collections/

Google的包,里面有很多并发的牛B类:

AtomicLongMap,等等

大对象的数据结构:https://github.com/HugeCollections/Collections 

注意事项:

并发容器多数不能使用null值

时间: 2024-09-29 11:33:33

Java中的数据结构一览的相关文章

浅谈Java中常用数据结构的实现类 Collection和Map_java

线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口 Collection是最基本的集合接口,一个C

剖析Java中HashMap数据结构的源码及其性能优化_java

存储结构首先,HashMap是基于哈希表存储的.它内部有一个数组,当元素要存储的时候,先计算其key的哈希值,根据哈希值找到元素在数组中对应的下标.如果这个位置没有元素,就直接把当前元素放进去,如果有元素了(这里记为A),就把当前元素链接到元素A的前面,然后把当前元素放入数组中.所以在Hashmap中,数组其实保存的是链表的首节点.下面是百度百科的一张图: 如上图,每个元素是一个Entry对象,在其中保存了元素的key和value,还有一个指针可用于指向下一个对象.所有哈希值相同的key(也就是

java中Collection里面没有的数据结构

问题描述 java中Collection里面没有的数据结构 之前跟别人讨论过java Collection里面的数据结构,他说公司里很少要自己写数据结构,这是真的吗? 还有那么各种树为什么java里面没有提供?是因为用的不频繁吗 解决方案 等用到的时候再查嘛~ 解决方案二: 树的话可以参考jdk中的TreeModel接口,可以单独拿出来对树结构进行操作. 实例可以在网上搜索一下JTree的用法.

Java中使用数组实现栈数据结构实例_java

栈是Java语言中最重要的数据结构之一,它的实现,至少应该包括以下几个方法: 1.pop() 出栈操作,弹出栈顶元素. 2.push(E e) 入栈操作 3.peek() 查看栈顶元素 4.isEmpty() 栈是否为空 另外,实现一个栈,还应该考虑到几个问题: 1.栈的初始大小以及栈满以后如何新增栈空间 2.对栈进行更新时需要进行同步 简单示例,使用数组实现栈,代码如下: 复制代码 代码如下: public class Stack<E> {      // Java 不支持泛型数组,如需使用

数据结构 算法-如何用java中串的操作方法找出两个字符串中所有共同的字符

问题描述 如何用java中串的操作方法找出两个字符串中所有共同的字符 通过实现对串的基本操作的算法设计,运用模式匹配算法KMP和Brute-Force,展出两个字符串中所有共同的字符,判断一个字符串是否为E-mail地址

数据结构-java中的迭代器问题。

问题描述 java中的迭代器问题. package testcc; import java.util.Iterator; import java.util.NoSuchElementException; public class MyArrrayList implements Iterable { private static final int DEFAULT_CAPACITY = 10; private int theSize; private AnyType[] theItems; pub

Java的Hibernate框架中集合类数据结构的映射编写教程_java

一.集合映射 1.集合小介集合映射也是基本的映射,但在开发过程中不会经常用到,所以不需要深刻了解,只需要理解基本的使用方法即可,等在开发过程中遇到了这种问题时能够查询到解决方法就可以了.对应集合映射它其实是指将java中的集合映射到对应的表中,是一种集合对象的映射,在java中有四种类型的集合,分别是Set.Map.List还有普通的数组,它们之间有很大的区别: (1)Set,不可以有重复的对象,对象是无序的: (2)List,可以与重复的对象,对象之间有顺序: (3)Map,它是键值成对出现的

Java 中的 XML:使用 Castor 进行数据绑定

xml|数据 对于主要关心文档的数据内容的应用程序来说,Java 的 XML 数据绑定是 XML 文档模型的强大替代方案.在本文中,企业 Java 专家 Dennis Sosnoski 介绍了数据绑定并讨论了什么使它如此吸引人.然后他向读者展示了如何使用 Java 数据绑定的开放源代码 Castor 框架处理日益复杂的文档.如果您的应用程序关心 XML 的数据更甚于关心 XML 文档本身,您可能希望找出这个处理 Java 中 XML 的容易而又高效的方法.大多数处理应用程序中 XML 文档的方法

研究 Java 中 XML 文档模型的特性和性能

xml|性能 Java 中的 XML: 文档模型,第一部分:性能 研究 Java 中 XML 文档模型的特性和性能 文档选项 将此页作为电子邮件发送 最新推荐 Java 应用开发源动力 - 下载免费软件,快速启动开发 级别: 初级 Dennis M. Sosnoski, 总裁, Sosnoski Software Solutions, Inc. 2001 年 9 月 01 日 在本文中,Java 顾问 Dennis Sosnoski 比较几个 Java 文档模型的性能和功能.当选择模型时,无法做