在java中各类数据结构的API(一)

在java中各类数据结构的API(一)

1. 数据结构

​ 数据结构是计算机存储和组织数据的基础,一个好的数据结构可以大大减小算法的难度,从一定的基础上带来更高的运行效率和存储效率,个人认为在思考算法的时候,数据结构的确认是不可缺少的一环。

graph LR A[数据结构]--> B[逻辑结构] A[数据结构]--> C[存储结构] A[数据结构]--> D[操 作] B-->b1[集合-无其他关系] B-->b2[线性结构-一对一] B-->b3[树性结构-一对多] B-->b4[图性结构-多对多] C-->c1[顺序存储-逻辑关系借用存储相对位置表示] C-->c2[非顺序存储-通过指针表示逻辑关系]

​ 同一个逻辑结构可以通过不同存储结构来实现,存储结构不同实现就不同,但是设计和逻辑是一致的。

2. 逻辑结构的相关API

1. 线性结构

线性结构是一个有序数据元素集合

常用的线性结构有:线性表,栈,队列,双队列,串(一维数组)。

graph TD A[线性结构]-->B[一维数组] A-->c[栈] A-->d[队列]

1. 一维数组

一维数组是数据结构中最基本的一种结构。能够顺序的存储元素,所存元素在一维数组中可以不唯一。一维数组有两种实现方式,顺序存储和链式存储。

1. 接口

一维数组的接口主要为List。

A:添加功能
boolean add(E e):向集合中添加一个元素
void add(int index, E element):在指定位置添加元素
boolean addAll(Collection<? extends E> c):向集合中添加一个集合的元素。
    
B:删除功能
void clear():删除集合中的所有元素
E remove(int index):根据指定索引删除元素,并把删除的元素返回
boolean remove(Object o):从集合中删除指定的元素
boolean removeAll(Collection<?> c):从集合中删除一个指定的集合元素。

C:修改功能
E set(int index, E element):把指定索引位置的元素修改为指定的值,返回修改前的值。

D:获取功能
E get(int index):获取指定位置的元素
Iterator iterator():就是用来获取集合中每一个元素。

E:判断功能
boolean isEmpty():判断集合是否为空。
boolean contains(Object o):判断集合中是否存在指定的元素。
boolean containsAll(Collection<?> c):判断集合中是否存在指定的一个集合中的元素。

F:长度功能
int size():获取集合中的元素个数

G:把集合转换成数组
Object[] toArray():把集合变成数组。
2. 实现类
  1. ArrayList:数组实现,查询效率高,但是增加删除效率低,线程不安全。
  2. LinkedList:使用双向链表实现,查询效率低,但是增加删除效率高,线程不安全。
  3. Vector:数组实现,主要特点是线程安全。

2. 栈

堆栈(stack)是线性表的一种,只能在该线性表的表尾进行插入、获取或删除的操作。该线性表具有LIFO(后进先出)的特点

1. Stack实现

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 pushpop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。

boolean empty();//判断栈是否为空
E peek();//查看栈顶的对象,但是不删除该对象
E pop();//弹出栈顶的对象
E push(E item);//将一个对象压入栈
int search(Object o);//返回对象在栈中的位置

2. LinkedList实现

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 getremoveinsert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列双端队列。此类实现 Deque 接口,为 addpoll 提供先进先出队列操作,以及其他堆栈和双端队列操作。

int size();//返回此列表的元素数。
E pop();//从此列表所表示的堆栈处弹出一个元素。
void push();//将元素推入此列表所表示的堆栈。
E peek();//查看栈顶的对象,但是不删除该对象

3. 队列

java中虽然有Queue接口,但是java并没有给出具体的队列实现类,而Java中让LinkedList类实现了Queue接口,所以使用队列的时候,一般采用LinkedList。因为LinkedList是双向链表,可以很方便的实现队列的所有功能。

Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用
element()或者peek()方法。

Queue<E> queue = new LinkedList<E>();
offer(e)     //进队列,将元素加入队列末尾
poll()         //获取队列头的元素并移除
peek()        //获取队列头的元素
isEmpty() //判断是否为空
posted @ 2021-05-28 19:59  锤子布  阅读(246)  评论(0编辑  收藏  举报