前述
数组是各编程语言中最为基础的一个数据结构,在Java 语言中,平时使用也很多,同时,JDK 提供了 动态数组的实现,ArrayList,这里 我使用数组来实现一下动态数组,
参考实现
import java.util.function.Consumer; /** * 使用数组 实现动态数组 ArrayList */ public class DynamicArray<E> { // new ArrayList<String>() //1、声明数组 private Object[] array; //默认大小 private final int INITIAL_CAPACITY = 10; //构造器 public DynamicArray() { this.array = new Object[INITIAL_CAPACITY]; } //大小 private int size; /** * 返回数组元素数 * * @return */ public int size() { return size; } /** * 是否为空 * * @return */ public Boolean isEmpty() { return size == 0; } /** * 中间添加元素 * * @param index * @param element */ public void add(int index, E element) { //判断索引是否合法 if (index < 0 || index > size) { throw new IndexOutOfBoundsException(index); } else { //判断是否需要扩容 if (size >= array.length) { //进行扩容 grow(); } else { //腾位置,指定位置写元素 for (int i = size - 1; i >= index; i--) { array[i + 1] = array[i]; } array[index] = element; } } size++; } /** * 末尾添加元素 * * @param element */ public void add(E element) { this.add(size, element); } /** * 获取指定位置元素 * * @param index * @return */ public E get(int index) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException(index); } else { return (E) array[index]; } } /** * 删除指定位置元素 * * @param index 要删除的数据索引 * @return 删除的数据 */ public E remove(int index) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException(index); } else { Object temp = array[index]; for (int i = index + 1; i < size - 1; i++) { array[i - 1] = array[i]; } size--; return (E) temp; } } /** * 重置指定位置元素 * * @param index 索引 * @param element 新数据 * @return 旧数据 */ public E set(int index, E element) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException(index); } else { Object e = array[index]; array[index] = element; return (E) e; } } /** * 遍历 * * @param consumer */ public void forEache(Consumer<E> consumer) { for (int i = 0; i < size; i++) { consumer.accept((E) array[i]); } } /** * 扩容 * for (int i = 0; i < array.length; i++) { * newArray[i] = array[i]; * } * arraycopy 是 native 修饰的方法,底层可以使用 C 语言的 api 进行处理,效率更高 * * @IntrinsicCandidate public static native void arraycopy(Object src, int srcPos, * Object dest, int destPos, * int length); */ private void grow() { Object[] newArray = new Object[array.length * 2]; System.arraycopy(array, 0, newArray, 0, array.length); array = newArray; } /** * 判断索引是否有效 * * @param index 索引 * @return true 有效 */ private boolean checkIndex(int index) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException(index); } else { return true; } } /** * 格式化输出 * @return */ @Override public String toString() { if (isEmpty()) { return "[]"; } else { StringBuilder builder = new StringBuilder(); builder.append("["); forEache(item -> builder.append(item).append(",")); builder.replace(builder.length() - 1, builder.length(), ","); return builder.toString(); } } public static void main(String[] args) { DynamicArray<Integer> arr = new DynamicArray<>(); for (int i = 0; i < 15; i++) { arr.add(i); } System.out.println(arr); } }
标签:index,Java,int,数组,return,array,动态,public,size From: https://www.cnblogs.com/wdh01/p/17964722