实现一个简单的java集合框架
来源:互联网 发布:微课录屏软件有哪些 编辑:程序博客网 时间:2024/06/05 00:26
主要实现了集合框架中标准的bag,queue,stack三种结构,每种结构分别提供了数组和链表两种实现方式。
1.接口定义
1.1Collection接口:
/** *集合接口,主要定义了集合的长度和集合是否为空的方法 */public interface Collection { boolean isEmpty(); int size();}
1.2Queue接口:
/** * * 这是一个队列接口,主要包括一个出队和入队方法 */public interface Queue<E> extends Collection{ void enqueue(E item); E dequeue();}
1.3Stack接口:
/** *栈接口,定义了出栈和入栈方法 * @param <E> */public interface Stack<E> extends Collection{ void push(E item); E pop();}
1.4Bag接口:
/** *背包接口 *只有一个add方法 * @param <E> */public interface Bag<E> extends Collection{ void add(E item);}
2.抽象类
2.1AbstractCollection集合抽象类:
/** *使用java的Iterable接口 *实现了集合两个主要方法 *该类中定义了集合共有属性和方法 * @param <E> */public abstract class AbstractCollection<E> implements Iterable<E>, Collection {// 集合的大小 int size;// 集合是否为空的判断 public boolean isEmpty() { return size == 0; } public int size() { return size; }// 集合的toString @Override public String toString() { Iterator<E> iter = iterator(); StringBuilder sb = new StringBuilder(); while (iter.hasNext()) { sb.append(iter.next() + " "); } return sb.toString(); }// 范围检查 protected void checkRange(int index) { if (index >= size) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } private String outOfBoundsMsg(int index) { return "Index: " + index + ", Size: " + size; }}
2.2AbstractArrayList抽象数组类
/** *集合框架的数组实现方式 * @param <E> */public abstract class AbstractArrayList<E> extends AbstractCollection<E> {// 数组的初始容量 protected static final int DEFAULT_CAPACITY = 10;// 遍历的顺序有两种FIFO和LIFO 这种设计主要是考虑了stack,bag和queue迭代方式不同// First Input First Output的缩写,先进先出// Last Input First Output的缩写,后进先出 protected boolean isFIFO = true;// 数组实现的核心 protected Object[] elementData;// 在该类中实现了迭代器 private class ArrayIterator<T> implements Iterator<T> {// 迭代器的游标 private int cursor = 0;// 迭代器的构造器 public ArrayIterator() {// 根据迭代器可以选择迭代顺序 if (isFIFO) this.cursor = 0; else this.cursor = size; }// @Override public boolean hasNext() { if (isFIFO) return this.cursor != size; else return this.cursor != 0; } @Override public T next() { T item; if (isFIFO) item = (T) elementData[cursor++]; else item = (T) elementData[--cursor]; return item; } }// 迭代器 @Override public Iterator<E> iterator() { return new ArrayIterator<>(); }// 数组容量检查方法 protected void ensureCapacity() { int capacity = elementData.length; if (size >= capacity) { int enlarge = capacity >> 1; if (enlarge < DEFAULT_CAPACITY) { enlarge = DEFAULT_CAPACITY; } grow(enlarge + capacity); } }// 数组扩容 private void grow(int minCapacity) { int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; elementData = Arrays.copyOf(elementData, newCapacity); }}
2.3AbstractLinkedList抽象链表类
/** *抽象链表实现 * @param <E> */public abstract class AbstractLinkedList<E> extends AbstractCollection<E> {// 链表的头结点 protected Node<E> first;// 链表实现的核心内部类,节点 protected static class Node<E> { E item; Node<E> next; }// 链表迭代器内部类 private class LinkedIterator<T> implements Iterator<T> {// 由第一个链表开始迭代 Node<E> current = first; @Override public boolean hasNext() { return current != null; } @Override public T next() { T item = (T) current.item; current = current.next; return item; } }// 返回迭代器 @Override public Iterator<E> iterator() { return new LinkedIterator<>(); }}
3.数组实现
3.1使用数组的实现背包Bag:
/** *数组实现背包 * @param <E> */public class ArrayBag<E> extends AbstractArrayList<E> implements Bag<E> {// 初始化数组 public ArrayBag() { this(DEFAULT_CAPACITY); } public ArrayBag(int initialCapacity) { this.elementData = new Object[initialCapacity];// Bag是LIFO后进先出的,因此这是false this.isFIFO = false; }// 加入Bag @Override public void add(E item) { ensureCapacity(); elementData[size++] = item; }}
3.2使用数组实现Queue:
/** * 使用数组实现队列 * * @param <E> */public class ArrayQueue<E> extends AbstractArrayList<E> implements Queue<E> { public ArrayQueue() { this(DEFAULT_CAPACITY); } public ArrayQueue(int initialCapacity) { this.elementData = new Object[initialCapacity]; // 队列是FIFO先进先出的 this.isFIFO = true; }// 入队在结尾添加 @Override public void enqueue(E item) { ensureCapacity(); elementData[size++] = item; }// 出队在开头移除 @Override public E dequeue() { E item = (E) elementData[0]; deleteFirst(); return item; } private void deleteFirst() { size--; Object[] newElementData = new Object[elementData.length - 1]; System.arraycopy(elementData, 1, newElementData, 0, size); elementData = newElementData; }}
3.3使用数组实现Stack:
/** *使用数组实现Stack * @param <E> */public class ArrayStack<E> extends AbstractArrayList<E> implements Stack<E> { public ArrayStack() { this(DEFAULT_CAPACITY); } public ArrayStack(int initialCapacity) { this.elementData = new Object[initialCapacity];// Stack是后进先出的 this.isFIFO = false; }// 压栈 public void push(E item) { ensureCapacity(); elementData[size++] = item; }// 弹栈 public E pop() { E item = (E) elementData[--size]; elementData[size] = null; return item; }}
4.链表实现
4.1链表实现Bag
/** * 使用链表实现Bag * * @param <E> */public class LinkedBag<E> extends AbstractLinkedList<E> implements Bag<E> { // 将元素加入背包 public void add(E item) { Node<E> oldfirst = first; first = new Node<>(); first.item = item; first.next = oldfirst; size++; }}
4.2链表实现Queue
/** * 使用链表实现队列 * * @param <E> */public class LinkedQueue<E> extends AbstractLinkedList<E> { // 定义尾节点 private Node<E> last; // 入队方法 public void enqueue(E item) { Node<E> oldlast = last; last = new Node<E>(); last.item = item; last.next = null; if (isEmpty()) first = last; else oldlast.next = last; size++; } // 出队方法 public E dequeue() { E item = first.item; first = first.next; if (isEmpty()) last = null; size--; return item; }}
4.3使用链表实现Stack
/** *使用链表实现Stack * @param <E> */public class LinkedStack<E> extends AbstractLinkedList<E> implements Stack<E> {// 压栈 public void push(E item) { Node<E> oldfirst = first; first = new Node<>(); first.item = item; first.next = oldfirst; size++; }// 在不弹栈的情况下拿到第一个值 public E peek() { E item = first.item; return item; }// 弹栈 public E pop() { E item = first.item; first = first.next; size--; return item; } /** * 删除该索引之后所有节点 * @param index */ public void deleteAfter(int index) { checkRange(index); Node<E> node = first; for (int i = 0; i < index; i++) { node = node.next; } while (node.next != null) { node.next = node.next.next; size--; } }}
阅读全文
1 0
- 实现一个简单的java集合框架
- 基于JAVA集合框架实现一个简单的学生管理系统
- 黑马程序员--反射--实现一个简单的集合操作框架
- 利用java集合框架写的一个简单扑克游戏
- 一个简单的Web UI自动化测试框架Java实现
- Java实现一个简单的RPC框架(一) 本地调用
- Java实现一个简单的RPC框架(二) 协议
- Java实现一个简单的RPC框架(六) 注册机制
- 动手实现一个简单的java web框架
- java简单的集合框架(一)
- java 集合框架的一个澄清
- Java集合框架collection各接口的实现类使用方法简单而实用的总结
- java的集合框架实现栈,队列
- Java集合框架之如何用LinkedList实现简单的栈和队列
- 一个简单的rpc框架的实现
- 一个简单的rpc框架的实现
- [JAVA]集合框架之自己实现一个具有基本增查删改功能的ArrayList
- 一个简单androidUI框架的实现
- 【Redis】windows环境下redis的安装与python的简单调用
- oracle分区表详解
- 计算机书籍推荐
- windows下开启文件共享的访问日志
- 二叉树的中序遍历
- 实现一个简单的java集合框架
- bam文件softclip , hardclip ,markduplicate的探究
- Tensorflow 机器翻译NMT笔记 1 快速上手
- 拆分
- bzoj 3333: 排队计划 树状数组+线段树
- POJ2632--Crashing Robots(模拟)
- google检测是否数据发送完成
- nmap学习
- 解决thinkPHP3.2.3使用Smarty模板后无法使用系统常量问题!