美文网首页
线性数据结构之数组

线性数据结构之数组

作者: Autopassion | 来源:发表于2020-02-29 00:12 被阅读0次

前言


数组是线性数据结构的典型代表,不仅在我们的日常开发中使用十分广泛,而且在JDK源码中也有很多它的身影,所以数组的重要性不言而喻。本文接下来会讲述如何将原生的数组封装成支持泛型并可以自动扩容的线性数据结构,这里对于数组的基础使用部分就不赘述了。

1.泛型支持


由于原生的数组对泛型并不支持,可以采用Object类型数组来进行数据的存储,然后使用类型强转的方式提供泛型支持。

public class CustomArray<E> {
    //数组大小
    private int size;
    //内部封装数组
    private E[] array;
    //默认数组容量大小
    private static final int DEFAULT_CAPACITY = 100;
    //数组的负载因子
    private static final double loadFactor = 0.75F;
    
    /**
     *初始化自定义数组
    *@param capacity 数组容量
    */
   public CustomArray(int capacity){
        size = 0;
        array = (E[]) new Object[capacity];
   }
}

2.元素添加


可以在执行下标位置进行元素的添加,注意对输入下标进行检查,防止数组下标越界异常

/**
 * 添加元素
 * @param index 下标
 * @param element 元素
 */
public void add(int index,E element){
    //检查插入元素数组下标
    checkForIndexAdd(index);
    //插入下标位置及后的元素处理
    for (int i = size -1; i >= index ; i--) {
        array[i+1] = array[i];
    }
    //插入元素
    array[index] = element;
    //数组大小+1
    size++;
    //数组容量检查,如果超出临界容量进行自动扩容
    ...
}

3.动态扩容


定义一个数组的负载因子,计算数组存储数据量的临界值,当超过该临界值的时候进行自动扩容

/**
 * 检查数组的容量
 */
private void checkForCapacity(){
    if(size > array.length*LOAD_FACTOR)
        resize(2*array.length);
}

/**
 * 数组扩容
 * @param newCapacity 数组扩容后的容量
 */
private void resize(int newCapacity){
    array = Arrays.copyOf(array, newCapacity);
}

4.元素查找


可以在执行下标位置进行数据查找,对输入下标进行检查

/**
 * 查找数据
 * @param index 下标
 * @return
 */
public E findByIndex(int index){
    //检查数据下标
    checkForIndex(index);
    E element = array[index];
    return element;
}

5.元素删除

可以在执行下标位置进行数据删除,对输入下标进行检查

/**
 * 删除元素
 * @param index
 * @return
 */
public E del(int index){
    //检查下标
     checkForIndex(index);
     E delElement = array[index];
    //被删除下标后面的元素前移
    for (int i = index; i < array.length; i++) {
        array[index] = array[index + 1];
    }
    array[array.length - 1] = null;
    size--;
    return delElement;
}

总结


这里我们基于原生的数组开发了一个自定义的数组结构,屏蔽了原生数组不支持泛型以及动态扩容的缺陷,其实ArrayList的底层也是基于数组实现,同时也支持上述的功能点,并且对一些地方有更好的实现,有兴趣的话可以查看一个ArrayList源码,可以对数组结构有一个更全面的认识。

相关文章

  • 重温:数据结构与算法 - 03数组

    数据结构与算法之美 - 数组 数据结构与算法之美-学习大纲 什么数组? 数组是一种 线性表 数据结构。它用一组 连...

  • 数据结构与算法

    线性数据结构 数据结构之数组[https://www.jianshu.com/p/2237c4287a25] 数据...

  • C#之数据结构(上)

    数据结构 一般将数据结构分为两大类: 线性数据结构和非线性数据结构。 线性数据结构有: 线性表、栈、队列、串、数组...

  • Java数据结构和算法概览

    Java数据结构和算法概览 数据结构 线性数据结构:常见的有一维数组,线性表,栈,队列,双队列,串。 非线性数据结...

  • 数据结构简要

    数据结构与算法 几种常见的数据结构 线性表(数组和链表)、栈、队列和树(二叉树) 一.线性表 1.数组 数组是...

  • 线性数据结构之一维数组

    线性数据结构也称为一维数据结构,包含一维数组和链表线性的数据结构强调的是存储与顺序 一维数组: 在通常编程时,我们...

  • 链表

    数据结构之链表 前面我们学习了三种线性结构的数据结构,动态数组,栈和队列,但是这三种数据结构其实说到底都是数组,即...

  • Java链表

    一、链表介绍 数组和链表都是最基础的线性数据结构,可以用来实现栈,队列等非线性,有特定应用场景的数据结构。数组作为...

  • 01.数据结构之数组篇

    文章为极客时间《数据结构与算法之美》的学习笔记。 什么是数组? 数组是一种线性表数据结构。它用一组连续的内存空间,...

  • 树的实现

    前面写那么多文章都是是线性数据结构的探索.无论数组,链表,栈,队列都是线性数据结构我们看到了线性数据结构的大多数时...

网友评论

      本文标题:线性数据结构之数组

      本文链接:https://www.haomeiwen.com/subject/kwyjhhtx.html