小伙伴们相信都知道动态数组吧,这是数组的一种,这次我们就来了解一下动态数组的实现及概念吧。
一、动态数组概念
编程时,我们有时候会想,数组应该定义成多大才合适,但事实是有时候可能不得而知,因此我们希望能够具有在数组运行时动态改变数组的能力,动态数组就是指在声明时并没有确定数组大小的数组,即忽略圆括号中的下标。当我们需要使用动态数组时,可随时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入门知识,请一定要记得关注我们的网站噢。
推荐阅读: