一.数据存储的常见结构
数据存储的常见结构有:栈,队列,数组,链表和红黑树
1.栈
栈:stack,又称堆栈,是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加,查找,删除操作
特点:
- 先进后出
- 栈的入口,出口都是栈的顶端位置
压栈:存元素。把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置
弹栈:取元素。把栈的顶端元素取出来,栈中已有元素依次向栈顶方向移动一个位置
2.队列
队列:queue,简称队,同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在另一端进行删除
特点:
- 先进先出
- 队列的入口,出口各占一侧
3.数组
数组:Array,,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素
特点:
- 查找元素快:通过索引,可以快速访问指定位置的元素
- 增删元素慢
4.链表
链表:linked list,,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域,介绍一下单链表
特点:
- 多个结点之间,通过地址进行连接
- 查找元素慢
- 增删元素快
5.红黑树
二叉树:binary tree,是每个结点不超过2的有序树
约束:
-
节点可以是红色的或者黑色的
-
根节点是黑色的
-
叶子节点(特指空节点)是黑色的
-
每个红色节点的子节点都是黑色的
-
任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
特点:
速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍
二.List集合
1.接口
List接口继承于Collection接口,是单列集合的一个重要分支,习惯地会将实现了List接口的对象称为List集合。在List集合中允许出现重复的元素,所有元素是以一种线性方式进行存储,在程序中可以通过访问集合中的指定元素,另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致,先进先出
特点:
1.它是一个元素存取有序的集合
2.它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)
3.集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素
2.常用方法
add(int index,E element):增加插入元素,不能超过长度
get(int index):获取指定位置元素
indexof(Object o):获取指定元素的位置
remove(int index):移除指定位置元素
set(int index,E elemet):替换指定位置元素
三.List的子类
1.ArrayList集合
集合数据存储的结构是数组结构,元素增删慢,查找快,线程不安全,效率高
开发的时候不能随意使用ArrayList这是不严谨的,要具体看要求
2.LinkedList集合
集合数据存储的结构是链表结构,方便元素添加删除,查找慢
方法:
addFirst(),addLast(),getFirst(),getLast(),removeFirst(),removeLast
pop(),push()
3.Vector类
可以实现可增长的对象数组,线程安全的,效率低
四.Set集合
元素不可重复,无序
如何确定的元素不重复的原理
- 通过hashCode方法获取元素的hash值
- 根据hashCode%16,得到一个值0-15
- 根据得到的值,判断在容器的指定位置,是否存在元素
- 如果不存在,则将元素存在此位置
- 如果存在,判断hashCode是否相等
- 如果hashCode不相等,则将此元素挂在此数组下面
- 如果hashCode相等,通过equals方法,判断内容是否相同
- 如果内容不相同,则挂在该元素后面
- 如果内容相同,则不存储该元素
自定义元素存入HashSet,要保障不重复,需要重写equals和hashCode
LinkedHashSet特点:有序,不重复
TreeSet:排序,根据元素的自然顺序排序,也可通过定义比较方法,来根据方法排序