在java中各类数据结构的API(一)
在java中各类数据结构的API(一)
1. 数据结构
数据结构是计算机存储和组织数据的基础,一个好的数据结构可以大大减小算法的难度,从一定的基础上带来更高的运行效率和存储效率,个人认为在思考算法的时候,数据结构的确认是不可缺少的一环。
同一个逻辑结构可以通过不同存储结构来实现,存储结构不同实现就不同,但是设计和逻辑是一致的。
2. 逻辑结构的相关API
1. 线性结构
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. 实现类
- ArrayList:数组实现,查询效率高,但是增加删除效率低,线程不安全。
- LinkedList:使用双向链表实现,查询效率低,但是增加删除效率高,线程不安全。
- Vector:数组实现,主要特点是线程安全。
2. 栈
堆栈(stack)是线性表的一种,只能在该线性表的表尾进行插入、获取或删除的操作。该线性表具有LIFO(后进先出)的特点
1. Stack实现
Stack
类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector
进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push
和 pop
操作,以及取堆栈顶点的 peek
方法、测试堆栈是否为空的 empty
方法、在堆栈中查找项并确定到堆栈顶距离的 search
方法。
boolean empty();//判断栈是否为空
E peek();//查看栈顶的对象,但是不删除该对象
E pop();//弹出栈顶的对象
E push(E item);//将一个对象压入栈
int search(Object o);//返回对象在栈中的位置
2. LinkedList实现
List
接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null
)。除了实现 List
接口外,LinkedList
类还为在列表的开头及结尾 get
、remove
和 insert
元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。此类实现 Deque
接口,为 add
、poll
提供先进先出队列操作,以及其他堆栈和双端队列操作。
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() //判断是否为空