设计上比之前的 手写ArrayList 更进一步的仿照源码,更加面向对象。
我对源码中这部分设计的理解:接口用于定义规范,所有List容器都必须有这些功能,就像职业一样,你是程序员就必须会敲代码,我不管你是Java还是C还是什么,然后抽象类唯一的好处是可以装一些公用的方法,虽然接口现在(Java8之后)也可以写有实现的方法(default关键字),但不能用到变量,功能性上还是不如抽象类,还有一部分原因可能是List是从1.2开始就有的,那时候还没接口,所有这么设计了,其实也可以看作是一种规范。
不多bb,直接看代码。
首先是List接口
/**
* @author ethan
* @date 2019/10/23 13:21
*/
interface List<E> {
int DEFAULT_CAPACITY = 10;
int ELEMENT_NOR_FOUND = -1;
/**
* 清除所有元素
*/
void clear();
/**
* 元素的数量
* @return
*/
int size();
/**
* 是否为空
* @return
*/
boolean isEmpty();
/**
* 是否包含某个元素
* @param element
* @return
*/
boolean contains(E element);
/**
* 添加元素到尾部
* @param element
*/
void add(E element);
/**
* 获取index位置的元素
* @param index
* @return
*/
E get(int index);
/**
* 设置index位置的元素
* @param index
* @param element
* @return 原来的元素ֵ
*/
E set(int index, E element);
/**
* 在index位置插入一个元素
* @param index
* @param element
*/
void add(int index, E element);
/**
* 删除index位置的元素
* @param index
* @return
*/
E remove(int index);
/**
* 查看元素的索引
* @param element
* @return
*/
int indexOf(E element);
}
抽象类
/**
* @author ethan
* @date 2019/10/23 13:27
*/
public abstract class AbstractList<E> implements List<E> {
/**
* 元素的数量
*/
protected int size;
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean contains(E element) {
int i = indexOf(element);
if (i == ELEMENT_NOR_FOUND) {
return false;
}
return true;
}
/**
* 添加元素到尾部
* @param element
*/
@Override
public void add(E element) {
add(size, element);
}
protected void rangeCheck(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("index=" + index +", size=" + size);
}
}
protected void rangeCheckForAdd(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("index=" + index +", size=" + size);
}
}
}
LinkedList实现类
/**
* @author ethan
* @date 2019/10/23 09:20
*/
public class LinkedList<E> extends AbstractList<E> {
private Node<E> first;
private static class Node<E> {
E element;
Node<E> next;
public Node(E element, Node<E> next) {
this.element = element;
this.next = next;
}
}
@Override
public boolean contains(E element) {
return indexOf(element) != ELEMENT_NOR_FOUND;
}
@Override
public int size() {
return size;
}
@Override
public void clear() {
size = 0;
first = null;
}
@Override
public E get(int index) {
return node(index).element;
}
@Override
public E set(int index, E element) {
Node<E> node = node(index);
E old = node.element;
node.element = element;
return old;
}
@Override
public void add(int index, E element) {
rangeCheckForAdd(index);
if (index == 0) {
first = new Node<>(element, first);
} else {
Node<E> prev = node(index - 1);
prev.next = new Node<>(element, prev.next);
}
size++;
}
@Override
public E remove(int index) {
rangeCheck(index);
E element = node(index).element;
if (index == 0) {
first = first.next;
} else {
node(index-1).next = node(index-1).next.next;
}
size--;
return element;
}
@Override
public int indexOf(E element) {
if (element == null) {
Node<E> node = first;
for (int i = 0; i < size; i++) {
if (node.element == null) {
return i;
}
node = node.next;
}
} else {
Node<E> node = first;
for (int i = 0; i < size; i++) {
if (element.equals(node(i).element)) {
return i;
}
node = node.next;
}
}
return ELEMENT_NOR_FOUND;
}
/**
* 获得index对应位置元素
* @param index
* @return
*/
private Node<E> node(int index) {
rangeCheck(index);
Node<E> node = first;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("size = ").append(size).append(" [");
Node<E> node = first;
for (int i = 0; i < size; i++) {
if (i == 0) {
builder.append(node.element.toString());
} else {
builder.append(" ,").append(node.element.toString());
}
node = node.next;
}
builder.append("]");
return builder.toString();
}
}
网友评论