Java中的数据结构一览

本文概述了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=newArrayDeque<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:

publicHashSet(){

map=newHashMap<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,newWeakReference(value))。



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

LRUCache,LongHashMap,Java7中的LinkedTransferQueue,

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

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

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

AtomicLongMap,等等

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

注意事项:

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


第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的第一个模块——主函数main()的功能是:根据选单的选项调用各函数,并完成相应的功能。 
   第二个模块——Menu()的功能是:显示提示选单。 
   第三个模块——Quit()的功能是:退出选单。 
   第四个模块——Create()的功能是:创建新的数据记录。 
   第五个模块——Add()的功能是:增加新的数据记录,并返回选单。 
   第六个模块——Find()的功能是:按要求查询相关的信息,如果找到了,则显示该信息,如果未找到,则提示文件中没有该信息,并返回选单。 
   第七个模块——Alter()[的功能是:修改某条记录的信息,如果未找到要修改的记录,则提示系统中无此记录,并返回选单。 
   第八个模块——Delete()的功能是:删除某条记录,如果未找到要删除的记录,则提示通讯录中没有,并返回选单。 
   第九个模块——List()的功能是:显示所有记录。 一、用链表或者顺序表实现以下系统,完成线性表的建立(至少包括10个结点),以及线性表中信息(结点)的插入、查找、删除、修改、输出等操作,具体的模块要求见上方的“总的模块要求”。建议用“文件”存储数据。 1.通讯录管理系统的设计实现 (1)通讯者信息包括:编号(char num[10])、姓名(char name[10])、性别(char sex[10])、电话(char phone[20]) (2)除了总的模块要求外,还需统计通讯录中男性人数及女性人数,并求出通讯录中的男女比例。 男女比例。
### Java 集合框架的继承关系类图结构 Java 集合框架是一个统一的体系结构,用于表示和操作集合数据,它通过一组接口和实现类提供通用的数据结构操作。整个集合框架基于多个接口,如 `Collection`、`List`、`Set`、`Map` 等,并提供了诸如 `ArrayList`、`LinkedList`、`HashSet`、`HashMap`、`TreeMap` 等常用实现类[^1]。 集合框架中还包含抽象类,如 `AbstractCollection`、`AbstractList`、`AbstractSet`、`AbstractMap`,它们为集合类提供了部分实现,简化了自定义集合类的开发。实现类通过继承这些抽象类并实现接口方法,构建出完整的集合类层次结构[^3]。 #### Java 集合类的继承关系图 以下是对 Java 集合类主要结构的描述: - **`Collection` 接口** 是集合的根接口,定义了集合的基本操作。 - `List` 接口:有序、可重复的集合,实现类包括 `ArrayList`、`LinkedList`。 - `Set` 接口:无序、不可重复的集合,实现类包括 `HashSet`、`LinkedHashSet`、`TreeSet`。 - `Queue` 接口:支持队列操作的集合,如 `PriorityQueue`。 - **`Map` 接口** 是独立于 `Collection` 的接口,表示键值对集合。 - 实现类包括 `HashMap`、`LinkedHashMap`、`TreeMap`、`Hashtable`。 - `Hashtable` 是线程安全的实现,而 `HashMap` 不是,但可以通过 `Collections.synchronizedMap` 包装来实现同步。 - **抽象类** 提供了对集合接口的部分实现。 - `AbstractCollection` 是 `Collection` 接口的抽象实现。 - `AbstractList`、`AbstractSet`、`AbstractMap` 分别为 `List`、`Set`、`Map` 提供基础实现。 - **工具类 `Collections`** 提供了多种静态方法用于操作集合,例如排序、查找最大最小值、反转列表等。 #### 示例代码:查看类继承关系 在 IntelliJ IDEA 中可以使用快捷键 `Ctrl+Shift+Alt+U`(Windows)或 `Cmd+Shift+Alt+U`(Mac)查看类的继承关系图: ```java import java.util.ArrayList; public class InheritanceExample { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); System.out.println(list.getClass().getSuperclass()); } } ``` 执行上述代码会输出 `class java.util.AbstractList`,表示 `ArrayList` 继承自 `AbstractList`。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值