GitHub代码分享
项目主页:https://github测试数据/gozhuyinglong/blog-demos
本文源码:https://github测试数据/gozhuyinglong/blog-demos/tree/main/java-data-structures
数组(Array)
数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。其特性有:
1、数组是一个线性表,每个线性表上的数据最多只有前和后两个方向。
2、数组的存储元素是连续的,此特性最大的优点是检索速度非常快,但是插入和删除效率很低,为了保证连续性需要做大量的数据搬移工作,下面会有代码示例来说明。
数组连续的内存空间 3、数据的大小是固定的,因为在数组定义的时候,需要为它分配连续的内存空间,所以需要预先指定其大小。当存放的数据大于其大小时,我们需要重新分配一块更大的空间,把原来的数据复制过去。下面这段代码解释一个数组arr在必要的时候如何被扩容:
int[] arr = new int[10]; ... // 下面我们决定扩大arr int[] newArr = new int[arr.length * 2]; for(int i = 0, i < arr.length, i++){ newArr[i] = arr[i]; } arr = newArr;
代码示例
插入数据
public static String[] insert(String[] array, int index, String data) { // 判断参数是否合法 if (array == null || array.length == 0 || index < 0 || index > array.length) { throw new RuntimeException("参数不合法!"); } // 复制出一个长度+1的数组 String[] newArray = Arrays.copyOf(array, array.length + 1); // 将数据从index开始往后移1位;若index为最后一位,则无需移动 if (array.length > index) { System.arraycopy(newArray, index, newArray, index + 1, newArray.length - index - 1); } // 将值放到index下标上 newArray[index] = data; return newArray; }
执行过程(index = 2, data = m)
向数组插入数据
删除数据
public static String[] remove(String[] array, int index) { // 判断参数是否合法 if (array == null || index < 0 || index >= array.length) { throw new RuntimeException("参数不合法!"); } // 将数据从index+1处往前移一位 System.arraycopy(array, index + 1, array, index, array.length - index - 1); // 复制出长度-1的数组 return Arrays.copyOf(array, array.length - 1); }
执行过程(index = 1)
从数组中删除数据
执行结果
public static void main(String[] args) { String[] array = new String[]{"a", "b", "c", "d"}; // 在指定下标处插入数据 String[] insertArray = insert(array, 2, "m"); for (String arr : insertArray) { System.out.print(arr); } System.out.println(); // 删除指定下标的数据 String[] removeArray = remove(array, 1); for (String arr : removeArray) { System.out.print(arr); } }
输出结果:
abmcd acd
方法学习
Arrays.copyOf
/** original: 原数组 newLength: 副本数组大小 */ public static <T> T[] copyOf(T[] original, int newLength)
复制指定数组,返回数组副本。需指定副本的大小,若副本长度超过原数组,则多余数组会填充为空;若副本长度少于原数组,则会截断原数组,并且此方法不会改变原数组。
其底层调用了System.arraycopy方法
System.arraycopy
/** src: 原数组 srcPos: 原数组起始位置 desc: 目标数组 descPos: 目标数组起始位置 length: 拷贝的长度 */ public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
将原数组中的数据拷贝到目标数组中,需指定原数组起始位置、目标数组起始位置和要拷贝的长度
参考
数据结构与算法分析:https://book.douban测试数据/subject/26745780/
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did164150