Java数组总结

发布时间:2026/10/19 2:13:21
Java数组总结
1.数组的第一个内存图public class ArraayTest01 { public static void main(String[] args) { //动态创建数组 int[] arrnew int[5]; } }2.练习题2.1找出数组中最大值/** * 找出数组arr的最大值 * param arr * return */ public static int max(int[] arr){ if (arr.length0){ throw new RuntimeException(数组长度至少大于0); } if (arr.length1){ return arr[0]; } //假设数组中第一个元素是最大值 int maxarr[0]; for (int i 1 ; i arr.length; i) { if (arr[i]max){ maxarr[i]; } } return max; }2.2通过值获取索引/** * 找出数组中某个元素的下标 * param arr 要查找的数组 * param dest 要查找的元素 * return 数组的下标如果元素不存在则返回-1 */ public static int findIndex(int[] arr,int dest){ if (arrnull) return -1; for (int i 0; i arr.length; i) { if (arr[i]dest){ return i; } } return -1; }2.3数组元素的反转/** * 反转数组方法一 * param arr 原数组 * return 反转后的数组 */ /*public static int[] reverse(int[] arr){ if (arrnull) return null; //创建一个新的数组 int[] newArraynew int[arr.length]; for (int i 0; i arr.length; i) { newArray[i]arr[arr.length-1-i]; } return newArray; }*/ /** * 反转数组但是不创建新的数组对象 * param arr */ public static void reverse(int[] arr){ if (arrnull) { throw new RuntimeException(数组不能为空); } //第一个元素和最后一个元素交换 //第二个元素和倒数第二个元素交换 //77,56,87,12,56,25,23 奇数个 //77,56,87,12,56,25,2319 偶数个 for (int i 0; i arr.length / 2; i) { int temparr[i]; arr[i]arr[arr.length-1-i]; arr[arr.length-1-i]temp; } }3.Java5新特性-foreach//for-each语法//for(类型 变量名:数组名)//for-each优点是简洁缺点是没有下标public class ArrayTest01 { public static void main(String[] args) { int[] arr{12,3,4,4,54,5,6}; for (int i 0; i arr.length; i) { System.out.print(arr[i] ); } System.out.println(); //for-each for (int element:arr){ System.out.print(element ); } System.out.println(); Cat[] cats{new Cat(),new Cat(),new Cat(),new Cat()}; for (int i 0; i cats.length; i) { System.out.print(cats[i] ); } System.out.println(); for (Cat c : cats) { System.out.print(c ); } //将数组中每个元素用逗号拼接一个新的字符串“唱歌跳舞旅游” String[] hobbies{唱歌,跳舞,旅游}; String s; for (int i 0; i hobbies.length; i) { String hobby hobbies[i]; shobby; //加逗号 if (i!hobbies.length-1){ s,; } } System.out.println(s); } }4.数组工具类在JDK类库当中提供了一个便捷的工具类java.util.Arrays (方便数组的操作)这个工具类构造方法是私有化的因为工具类中所有的方法都是静态的调用时不需要new对象。需要掌握的数组工具类中的方法public static String toString(Type[] arr)public static boolean equals(Type[] a1,Type[] a2)public static boolean equals(Type[]a1,Type[]a2)public static void sort(Type[]arr)public static int binarySearch(Type[]arr,Type key)public static void fill(Type[]a,Type val)public static Type[]copyof(Type[]original,Type newLength)import java.util.Arrays; public class ArraysTest { public static void main(String[] args) { int[] arr{12,3,4,4,54,5,6}; //将数组转换为字符串 String s Arrays.toString(arr); System.out.println(s);//[12, 3, 4, 4, 54, 5, 6] //判断两个数组是否相等 一一对比 int[] arr2{12,3,4,4,54,5,6}; boolean equals Arrays.equals(arr, arr2); System.out.println(equals);//true String[] names1{jack,new String(tom),liming}; String[] names2{new String(jack),new String(tom),liming}; System.out.println(Arrays.equals(names1, names2));//true //排序方法 int[] a{45,56,4,63,12,89}; Arrays.sort(a); System.out.println(Arrays.toString(a)); //二分查找 排序 //[4, 12, 45, 56, 63, 89] System.out.println(Arrays.binarySearch(a,12));//1 //数组填充 Arrays.fill(a,1); System.out.println(Arrays.toString(a));//[1, 1, 1, 1, 1, 1] Arrays.fill(a,2,3,100); System.out.println(Arrays.toString(a));//[1, 1, 100, 1, 1, 1] //数组的拷贝 int[] nums{10,20,30,40,50,100,0,1}; //copyOf 方法都是默认从原数组的下标为0的位置开始拷贝 int[] newNums Arrays.copyOf(nums, 3); System.out.println(Arrays.toString(newNums));//[10, 20, 30] //拷贝某个区间 int[] newNums2 Arrays.copyOfRange(nums, 3, 5); System.out.println(Arrays.toString(newNums2));//[40, 50] } }5.数组的优缺点1.数组在Javα中每个元素类型是一致的相同的。2.数组中每个元素占用空间大小是一样的。3,数组中每个元素在空间存储上内存地址是连续的。4.Java中的数组一且创建长度不可变。5.优点查找效率极高因为它根本不去查找它底层是计算一个数学表达式直接计算出内存地址通过内存地址定位的因此数组中有100个元素和100万个元素查找效率完全相同时间复杂度是0(1)重点底层原理是知道首元素的内存地止每个元素占空间大小一样然后内存地址又是连续的因此只要知道下标就可以计算出下标位置元素和首元素的偏移量然后通过一个数学表达式快速计算出下标位置上元素的内存地址直接定位。根本不需要查找。6.缺点随机增删元素时为了保证元素的内存地止还是连续的后续元素统一向前或者向后位移效率较低。并且有时数组长度不够还需要扩容扩容的时候只能创建一个容量更大的数组进行数组拷贝。效率较低。对数组末尾元素进行删不影响效率。由于数组中元素的内存地止连续因此数组无法存储大数据量因为在内存空间上很雅找到一块巨大的连续的内存。7.数组比较适合使用在什么场景下缬繁的查找修改效率还可以很少的增删。8.面试题数组为什么检索效率高不要只回答因为有下标6.数组中存储引用时的内存图7.数组的扩容数组长度是不可变的如果满了怎么办扩容怎么扩容通常的方式是创建一个更大的数组将原数组的内容拷贝到新数组当中。完成扩容。因此扩容就涉及到数组的拷贝问题了。怎么拷贝第一种方式调用Arrays.copyOf() 或者Arrays.copyOfRange()第二种方式调用System类中提供的arraycopy()方法。注意copyOf() / copyOfRange()底层调用的还是System.arraycopy()方法。注意程序的优化尽可能的在创建数组的时候预测一下数组中即将要存储的数据量根据预估的数据量给定合适的容量减少数组的扩容次数提高效率。关于System.arraycopy()方法的使用public static native void arraycopy(object src,int srcPos,Object dest,int destPos,int length);是一个静态的方法。并且是一个native的方法。关于方法的参数Object srcint srcPosObject destint destPosint lengthimport java.util.Arrays; public class ArrayTest03 { public static void main(String[] args) { //原数组 int[] src{1,2,3,4,5,6}; //新数组 int[] destnew int[src.length*2]; //拷贝 System.arraycopy(src,0,dest,0,src.length); System.out.println(Arrays.toString(dest)); int[] dest2new int[3]; System.arraycopy(src,2,dest2,0,3); System.out.println(Arrays.toString(dest2)); } }8.二维数组什么是二维数组 一个特殊的一维数组只不过这个特殊的一维数组中每个元素它是一个一维数组。什么是三维数组不需要掌握一个特殊的一维数组只不过这个特殊的一维数组中每个元素它是一个二维数组。关于二维数组的初始化静态初始化、动态初始化public class ArrayTest03 { public static void main(String[] args) { int[] a1{1,2,3,4}; int[] a2{5,6,7}; int[][] anew int[][]{a1,a2}; //二维数组的静态初始化 int[][] arr{ {1,2,3,4}, {5,6,7} }; System.out.println(二维数组的长度是arr.length); //获取二维数组的第一个一维数组 int[] arr0 arr[0]; int arr00 arr0[0]; System.out.println(arr00); //arr[0][0] 第一个一维数组中第一个元素 System.out.println(arr[0][0]); //输出最后一个一维数组中的最后一个元素 System.out.println(arr[arr.length-1][arr[arr.length-1].length-1]); //遍历二维数组 for (int i 0; i arr.length; i) { //遍历一维数组 for (int j 0; j arr[i].length ; j) { System.out.print(arr[i][j] ); } System.out.println(); } } }public class ArrayTest03 { public static void main(String[] args) { //二维数组动态初始化 //定长 int[][] arrnew int[3][4]; arr[1][1]100; for (int i 0; i arr.length; i) { for (int j 0; j arr[i].length; j) { System.out.print(arr[i][j] ); } System.out.println(); } //不定长的 int[][] elementsnew int[3][]; elements[0]new int[]{1,2,3}; elements[1]new int[]{4,5}; elements[2]new int[]{6,7,8,9}; for (int i 0; i elements.length; i) { for (int j 0; j elements[i].length; j) { System.out.print(elements[i][j] ); } System.out.println(); } } }