JAVA中数据结构总结

本篇文章主要总结一下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就有利于节约内存空间。

posted @ 2018-06-27 17:55  是狗蛋儿  阅读(1264)  评论(0编辑  收藏  举报