一、简单了解数据结构
数据结构分为线性结构、树结构、图结构和哈希结构
- 线性结构:0至1个前趋或后继,线性结构包括顺序表、链表、栈(LIFO)、队列(FIFO);
- 树结构:0至1个前趋和0至n个后继(n>=2)树是一种非常重要的有层次的非线性结构,树的结构比较稳定和均衡;
- 图结构:0至n个直接前趋和0至n个直接后继(n>=2),图结构包括简单图、多重图、有向图和无向图等;
- 哈希结构:没有直接前趋和直接后继,哈希结构通过某种特定的哈希函数将索引与存储的值关联起来,是一种查找效率非常高的数据结构;
二、JAVA集合类
Collection
Collection是集合类的顶层接口,它是按照单个元素存储的;有两个子接口:List和Set
- List集合:
List集合是线性结构的主要实现,最常用的是ArrayList和LinkedList两个集合类;其他的还有Vector,CopyOnWriteArrayList等;
ArrayList:
容量可以改变、非线程安全的、基于数组实现的;集合扩容时,会把原有的数据复制到新数组中;数组在内存中的存储空间是连续的,数组每一个元素都有索引,通过索引可以直接定位到某一个元素,因此查询效率较高,但是插入和删除效率较低,因为会涉及到元素的移动;
LinkList
基于链表实现的,本质是双向链表,LinkedList 除了继承AbstractList抽象类之外,还实现了Deque(double-ended queue)接口,这个接口同时具有队列和栈的性质;链表不需要连续的存储单元,链表中的上一个元素通过指针就可以指向下一个元素,查询时,首尾元素查询较快,中间元素较慢(因为他是按照链路顺序查找的线性结构),删除效率较高,删除元素时,只需要删除前后指针,重新建立指针就可以了;
CopyOnWriteArrayList:
通过赋值数组副本来实现写入,是线程安全的,读的时候不上锁,写的时候上锁,来保证线程安全;(写的时候先将数组复制一份(copyOf动作),修改副本,然后将修改后的副本插入原数组)
Vector
基于数组实现的,但是是线程安全的,早期使用,现在用的不多;使用了synchronized锁,增删改查所有方法都上锁,性能较低;