常见的数据结构我们都知道有:队列、栈、数组、链表、树(二叉树、红黑树等)、图,那么怎么记会更好理解呢?还是要从特点出发:
1.队列:没有固定的实现方式,可以用数组实现,也可以用链表实现,特点就是先进先出。数据有序,但是数据之间可以没有任何关联
2.栈:没有固定的实现方式,可以用数组实现,也可以用链表实现,特点就是先进后出,后进先出。数据也是有序的,但是数据之间可以没有任何关联
3.数组:一群没有任何关联的数,按照一定的规则放到一起,数据是有序的。特点就是容量固定,根据下角标查找快,增删慢
4.链表:数据之间是一对一的关联关系,可以是单链表、双向链表、环形链表,特点就是查找慢,增删快
5.树:数据之间是一对多关系,比如二叉树、红黑树、23树等,特点就是查找、删快,但是增加构建树慢
6.图:数据之间是多对多关系,关系复杂,多维数组表示
所以,以上几种数据结构可以发现,3-6种就是一种数据之间关系渐进的,从没有任何关系、一对一、一对多、多对多逐步复杂,逐步增强的。下面我们再来看两种特殊的数据集合:
List:集合
特点就是,数据可以重复,元素的存入顺序和取出顺序一致,可以通过下角标来直接过去数据。
1.ArrayList 用数组结构实现,所以查找快,但是增删慢(涉及到数据整体复制移动和扩容)
2.LinkList 双向链表结构实现,但是链表结构没有下角标啊,咋实现通过角标获取数据的呢?原来是通过遍历到指定位置获取的。所以查找慢,但是增删快
set
特点就是,数据不可以重复,元素的存入顺序和取出顺序不一定一致。
1.HashSet:什么鬼?居然是用HashMap实现的。value为Object的HashMap,我晕。又绕回HashMap的实现原理了,那就是数组+链表(红黑树)。这其实就可以解释为什么不可以重复了,因为HashMap的链表不可以重复,也就可以理解为什么存入顺序和取出顺序不一定一致,因为遍历的时候是从数组的最开始那个链表开始的,逐个遍历所有数组中的链表,当然就无序了。
2.LinkHashSet:什么鬼?居然使用LinkHashMap实现的,LinkHashMap我们知道他是在HashMap的基础上,又单独增加了一个双向链表结构,也就是每个节点不仅仅有HashMap中的next节点,还要维护一个双向链表的before和after节点,所以我们既可以向操作HashMap一样来处理数据,也可以使得存入数据顺序和取出数据顺序一致(双向链表来实现的),但是维护起来可就麻烦多了。