java动态数组实现要怎么编写?具体概念是什么?

TheDisguiser 2020-06-09 11:52:14 java常见问答 4852

小伙伴们相信都知道动态数组吧,这是数组的一种,这次我们就来了解一下动态数组的实现及概念吧。

一、动态数组概念

编程时,我们有时候会想,数组应该定义成多大才合适,但事实是有时候可能不得而知,因此我们希望能够具有在数组运行时动态改变数组的能力,动态数组就是指在声明时并没有确定数组大小的数组,即忽略圆括号中的下标。当我们需要使用动态数组时,可随时new出ReDim语句来重新指出数组的大小。使用动态数组的优点是可以根据用户需要,有效利用存储空间。

在Visual Basic中,数动态数组最灵活方便,能够相当高效的管理内存。如:可在短时间使用一个大数组,然后,在不使用这个数组时,将内存空间释放给系统。

如果不想使用动态数组,就需要声明一个数组,让它的大小尽可能的达到最大,然后再抹去那些不必要的元素。但是,如果过度的使用这种方法,就会导致内存的操作环境变慢。

二、动态数组实现

示例:

package array;
//创建动态数组
public class Array < E >
{ //使用泛型
    private E[] data;
    private int size; //长度
    public Array(int capacity)
    {
        data = (E[]) new Object[capacity];
        size = 0;
    }
    public Array()
    {
        this(10); //设置默认值
    }
    public int getSize()
    {
        return size;
    }
    public int getCapacity()
    {
        return data.length;
    }
    public boolean isEmpty()
    {
        return size == 0;
    }
    //向所有元素的最后一个元素添加
    public void addLast(E e)
    {
        add(size, e);
    }
    //向第一个添加元素
    public void addFirst(E e)
    {
        add(0, e);
    }
    //向数组里指定的元素添加元素
    public void add(int index, E e)
    {
        //符合条件,扩容
        if (size == data.length)
            resize(2 * data.length);
        if (index < 0 || index > size)
        {
            throw new IllegalArgumentException("add failed");
        }
        for (int i = size - 1; i >= index; i--)
            data[i + 1] = data[i];
        data[index] = e;
        size++;
    }
    //获取index索引位置
    public E get(int index)
    {
        if (index < 0 || index >= size)
            throw new IllegalArgumentException("add failed");
        return data[index];
    }
    //修改
    void set(int index, E e)
    {
        if (index < 0 || index >= size)
            throw new IllegalArgumentException("add failed");
        data[index] = e;
    }
    @Override
    public String toString()
    {
        StringBuilder res = new StringBuilder();
        res.append(String.format("Array:size=%d,capacity=%d
", size, data.length));
        res.append("[");
        for (int i = 0; i < size; i++)
        {
            res.append(data[i]);
            if (i != size - 1)
                res.append(",");
        }
        res.append("]");
        return res.toString();
    }
    //查询是否有该元素
    public boolean contains(E e)
    {
        for (int i = 0; i < size; i++)
        {
            if (data[i].equals(e))
                return true;
        }
        return false;
    }
    //获得所查找到元素e所在的索引
    public int find(E e)
    {
        for (int i = 0; i < size; i++)
        {
            if (data[i].equals(e))
                return i;
        }
        return -1;
    }
    //从数组中删除元素并且返回
    public E remove(int index)
    {
        if (index < 0 || index >= size)
        {
            throw new IllegalArgumentException("Error");
        }
        E ret = data[index];
        for (int i = index + 1; i < size; i++)
            data[i - 1] = data[i];
        size--;
        //在此处使用防震挡处理
        if (size == data.length / 4 && data.length / 2 != 0)
            resize(data.length / 2);
        return ret;
    }
    //删除需要删除的元素
    public void removeElement(E e)
    {
        int index = find(e);
        if (index != -1)
            remove(index);
    }
    //扩容函数
    private void resize(int newCapacity)
    {
        E[] newdata = (E[]) new Object[newCapacity];
        for (int i = 0; i < data.length; i++)
        {
            newdata[i] = data[i];
        }
        data = newdata;
    }
    public E getLast()
    {
        return get(size - 1);
    }
    public E getFirst()
    {
        return get(0);
    }
    public E removeLast()
    {
        return remove(size - 1);
    }
    public E removeFirst()
    {
        return remove(0);
    }
}

以上就是今天的全部内容了,数组学习需要持之以恒的毅力,如果小伙伴们想要学习更多数组相关java入门知识,请一定要记得关注我们的网站噢。

推荐阅读:

java动态数组怎么赋值? java动态赋值的相关问题

java动态数组arraylist该如何使用?什么是arraylist?

linkedlist类的特点,有什么特点?