线性表:
线性表的顺序存储表示
(逻辑关系相邻的两个元素在物理位置上也相邻:在查找时可以随机的获取一个元素来确定其他元素位置,但是当要增删时,就需要移动大量元素)
线性表的顺序存储方式是在内存中用一组地址连续的存储单元依次存储线性表的数据元素,
用这种方式存储的存储的线性表称为顺序表(数组就是顺序存储结构)
顺序表中数据的逻辑关系通过其“存储位置相邻”来表示,如果顺序表中的元素有一定的顺序,则称之为有序顺序表:
数组:
? 数组底层存储的方式是顺序存储方式,是找到一快连续的内存,来存储一串连续的元素,数组一旦确定,其长度和元素之间的关系不在发生变化,
一维数组是一维的线性表,二维数组是数组的线性表,总之是开辟一块连续的空间来存储一串固定长度的不可变的元素,所以在数组中增删的时候
为了不让数组“断掉”,必须让其他元素移位,来保证存储空间的连续,又因为存储空间是连续的所以在查找元素时比较高效,
且不需要存储数据之间的链接地址,相对内存空间利用较高。
矩阵:
即多维数组,矩阵的存储方式有压缩存储,就是把相同的元素值只分配一个地址存储,0不分配存储地址,
有序(或者有规律的相同元素或者0(三角矩阵或者对角矩阵))的特殊元素矩阵称为特殊矩阵,无序的称为稀疏矩阵
线性表的链式存储表示(指针):
(地址任意的存储单元存储线性表中的数据元素,不要求逻辑上相邻的元素也在物理地址上相邻,所以没有了顺序存储中的增删的麻烦,
但是却失去了获取元素的随机性)
链表:
以结点的序列来表示线性表的,其中每一个结点包括两个域:一个是存放数据信息的域,称为数据域;存储直接后继位置的域,称为指针域
如LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。又因为链表的弊端是查找中间元素很慢,
所以实际开发中对链表集合元素的添加与删除经常是对其首尾进行操作,因而Java中的链表(LinkedList)提供了大量首尾操作的方法
只包含一个指针域的链表称为单链表
双向链表:有两个指针域:一个指向直接前驱,一个指向直接后继
单循环链表
双向循环链表
集合的使用原则
先确定是否允许集合中有重复:
允许,则使用list集合
再确定是增删多还是查询多
查询多,使用ArrayList
数据结构,底层是顺序存储,逻辑关系相邻的元素在物理地址上也相邻,查询快,增删慢,线程不安全
增删多,使用LinkedList
数据结构,底层是链式存储,每一个元素分为两个域,一个是数据域,一个是指针域,查询慢,增删快,线程不安全
不允许,则使用set集合
再确定是否需要有序
有序则使用linkedHashSet
底层元素唯一,底层数据结构是链表+哈希表,元素的存取顺序一致,线程不同步,不安全
无序则使用HashSet
元素唯一不重复,底层是哈希表结构(),元素的存储不保证有序,线程不同步,不安全
保证元素唯一的方法是HashCode()和equals()