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-10-04 11:44:54

java中的数据结构总结的相关文章

[转]详细介绍java中的数据结构

详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各种数据结构,但是我还是要说一说java版数据结构与算法,希望对你有帮助. 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. C

java中的数据结构(集合|容器)

对java中的数据结构做一个小小的个人总结,虽然还没有到研究透彻jdk源码的地步.首先.java中为何需要集合的出现?什么需求导致.我想对于面向对象来说,对象适用于描述任何事物,所以为了方便对于对象的操作.存储就出现了集合,集合应该是存储对象最常用的一种方式了,相对于数组更灵活,可变长度.同时集合也只能存储对象不能使基本数据类型. 集合框架分为两个派系Collection和Map而每一种集合类型都是基于特定的数据结构,Collection接口继承了Iterable接口所以可以使用Iterable

Java中的数据结构及排序算法

(明天补充) 主要是3种接口:List Set Map List:ArrayList,LinkedList:顺序表ArrayList,链表LinkedList,堆栈和队列可以使用LinkedList模拟 Set:HashSet没有重复记录的集合 Map:HashMap就是哈希表 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap 数据结构参考链接

java中的数据结构[copy]

转自http://developer.51cto.com/art/201107/273003.htm java版数据结构与算法,希望对你有帮助. 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set

JAVA中的数据结构——集合类(序):枚举器、拷贝、集合类的排序

枚举器与数据操作 1)枚举器为我们提供了访问集合的方法,而且解决了访问对象的“数据类型不确定”的难题.这是面向对象“多态”思想的应用.其实是通过抽象不同集合对象的共同代码,将相同的功能代码封装到了枚举器的这个接口里,就可以用一套代码来遍历不同类型的集合. 2)每个集合类(Vector或Hashtable等)都有一个iterator方法,各集合对象可以通过这个方法把遍历本类的控制权交给Iterator接口. 3)Iterator接口提供了boolean hasNext()方法判断是否到了集合的最后

Java中的数据结构有哪些?HashMap的工作原理是什么?

Java中常用数据结构 常用的数据结构有哈希表,线性表,链表,java.util包中有三个重要的接口:List,Set,Map常用来实现基本的数据结构 HashMap的工作原理 HashMap基于hashing原理,我们通过put(key,value)和get(key)方法存储和获取对象元素,当我们将key值传递给put()方法时,会自动调用对象元素的hashcode方法计算hashcode,然后根据hashcode确定对象元素具体存储的位置: 获取对象时,我们根据键对象的equals方法找到具

java 中Collection数据结构的用法

JAVA中常用的数据结构(java.util. 中) java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类.其主要的关系(继承关系)有:  (----详细参见java api文档!) Collection---->Collections                                                                          

Java中常见数据结构Map之HashMap

之前很早就在博客中写过HashMap的一些东西: 彻底搞懂HashMap,HashTableConcurrentHashMap关联: http://www.cnblogs.com/wang-meng/p/5808006.html HashMap和HashTable的区别: http://www.cnblogs.com/wang-meng/p/5720805.html 今天来讲HashMap是分JDK7和JDK8 对比着来讲的, 因为JDK8中针对于HashMap有些小的改动, 这也是一些面试会经

java中的数据结构

另一篇参考:http://blog.csdn.net/u010947402/article/details/51878166 也许你已经熟练使用了java.util包里面的各种数据结构,但是我还是要说一说java版数据结构与算法,希望对你有帮助. 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├Li