本篇文章主要总结一下JAVA中实现的几种数据结构
简述:
List<?>:链表结构。
Queue<?>:队列,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
Map<?,?>:用于存放键值对数据,键值对存储在Entry<?, ?>,不能存储重复的key值,相同的key值时,后面的value覆盖前面的value,key值允许为空。
Set<?>:由Map封装实现,结构特性和Map一致,但是只能存储单对象。
涉及到的数据结构:
栈:提供压栈(push)和出栈(pop)功能
队列:提供offer和pull的非阻塞方法,put和take的阻塞方法
链表:提供添加、查找、移除、遍历等各种函数
树:红黑树,通常用来做随机查找,取Top N或排序等功能
线程安全性
Queue、Vector、Stack、HashTable、ConcurrentHashMap是线程安全的,其余都是不安全的,后面新开一遍介绍Java的锁,将会深入讲解。
时间复杂度
List篇
顺序存储结构:在内存中开辟若干的连续空间,将每个空间存入数据,数据关联与其地址一致。
优点:1无需为表示表中元素之间的逻辑关系而添加空间
2可以快速地存取表中任意位置的元素
缺点:1插入和删除操作需要移动大量元素
2需要考虑索引越界为题
3扩容空间可能会造成空间浪费,缩小空间又可能会索引越界
4null值会造成空间“碎片”
链式存储结构:
优点:插入和删除操作只需改变节点next和prev成员的指向即可,无需移位,无需扩容
缺点:失去了直接存取表中任意位置元素的能力
1、存储分配方式:
顺序存储结构使用一段连续的存储单元依次存储线性表元素
链式存储结构使用任意存储单元存放线性表的元素
2、时间性能:
查找:
顺序存储结构O(1)
链式存储结构O(n)
插入和删除:
顺序存储结构O(n)
链式存储结构O(1)
3、空间性能:
顺序存储结构:空间分大了浪费,分小了上溢,还得扩容
链式存储结构:有空间就能分配,元素个数不受限制
言归正传。
ArrayList是顺序存储的线性表,LinkedList是链式存储的线性表
它们的特点都是有序,元素值可以重复。区别是底层算法不同。
Vector,这里我简单浏览了一下源代码,Vector底层算法和ArrayList是一样的
这里就不赘述了,直接说区别:
1、Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法线程不安全,由于线程的同步必然要影响性能,因此ArrayList的性能比Vector好。
2、Vector扩容时容量翻倍,而ArrayList只增加50%的大小,(直接查它们的grow()方法)这样,ArrayList就有利于节约内存空间。