数据结构 -- 表

声明: 本文章只是作为本人的个人笔记使用, 不保证可读性以及正确性.

有界表(ArrayList)

内部数据结构

一般使用数组实现, 如 Object[] data = new Object[capacity];

插入到尾部

数组插入data[???] = ObjectToInsert
插入的时候我们需要知道数组中的应该插入位置的索引, 因此需要一个字段记录当前的索引, 如
int currentIndex=0, 初始化为0 , 每次插入自增
这个字段也是当前列表的界限, 任何访问越界都需要抛出异常.

更新

当然这里需要越界检查
data[index] = newValue

查询

当然这里需要越界检查
return data[index]

以上只是对数组的基本操作的封装, 比较简单, 接下来是一些原生数组无法实现的功能.

删除

删除操作实际是是一个覆盖操作, 如用下图中的第二个数组, 把40之后的元素都向前移动一位就把30删除了.
这里写图片描述

下面研究一下ArrayUtils的实现.

    private static Object remove(final Object array, final int index) {
        final int length = getLength(array);
        if (index < 0 || index >= length) {
            throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
        }

        final Object result = Array.newInstance(array.getClass().getComponentType(), length - 1);
        System.arraycopy(array, 0, result, 0, index); // 复制被删除元素之前的所有元素到新数组
        if (index < length - 1) { // 如果被删除元素之后还有元素(不是最后一个元素), 复制相应的元素到新数组
            System.arraycopy(array, index + 1, result, index, length - index - 1);
        }

        return result;
    }

总体的思路就是
1. 创建一个空的拷贝数组
2. 复制除了被删除元素之外的所有元素到新数组

插入到任意位置

这个与删除元素相反:
1. 创建一个空的拷贝数组
2. 复制要插入位置之前的元素到新数组
3. 把要插入的元素添加到新数组尾部
4. 复制要插入位置之后的元素到新数组.

评价:
读取速度快(数组读取)
写入速度慢(需要拷贝)

无界表(LinkedList)

目的

解决有界表中的插入删除导致数组拷贝问题
解决有界表的大小限制问题

实现

内部数据结构采用非连续的储存, 对象引用.

// 双链表
Class Node<T>(){

    public T data;
    // 之前节点的引用
    public Node<T> prev;
    // 之后节点的引用
    public Node<T> next;
    public Node(T data, Node<T> prev, Node <T> next){
        // 构造器代码
}
}

头指针

初始化 head = new Node(null, null, null), 只有next 参数会有数据

尾指针

初始化 tail = new Node(null, head, null), 只有prev 参数会有数据

插入

private void addBefore(Node<T> node, T data){

    Node<T> newNode = new Node(data, node.prev, node); // 创建新节点
    newNode.prev.next = newNode; // 修复新节点前的链接
    newNode.next.prev = newNode; // 修复新节点后的链接


}

删除


private void remove(Node<T> node)
{

    node.pre.next = node.next; // 修复之前节点的链接
    node.next.prev = node.prev; // 修复之后节点的链接
}

评价:
写快: 只修改对象引用
读慢: 需要遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值