数组是指一组数据的集合,且同一个数组中存在的数据都是同一类型的,我们用下角标来表示元素在数组中的位置,从 0 开始 。数组的长度表示数组中元素的个数,所以说,长度为 5 的数组的索引是从 0 ~ 4 。
数组的声明就是在说明一下,哎,注意了,我需要一个容器来存放这些类型相同的元素 。声明的方式有这些。 int[] arr ; int arr[] 或是 对象的集合 People[] p ; 这样就声明了一个数组 。但注意此时只是一个在栈中的变量 。接下来就是数组的初始化,使用 new 关键字可以在堆中申请一块空白区域用于保存数组中的元素 。语法是这样,int[] arr = new int[5]; 这就表示创建了一个 5 个 int 类型的元素,而且这些元素是有默认值的,基本数据类型的默认值参考上一节,引用类型的元素默认值为 null 。另外数组在创建的时候需要指定其长度,且数组的长度在之后不可变 。像上面我们是指定了长度为 5 ,也可以传入一个变量 。这里解释一个数组的长度不可变,我们是用 arr 这个变量(遥控器)来操作堆中的数组,但是 arr 还是可以指向其它的数组对象的 ,所以我们说的数组不可变是值堆中的数组实体一旦创建,就不可变,而不是 arr 不能变。
到这里我们就已经得到一个空白的数组对象,有关于数组的操作等下说 。先说一下二维数组的定义和内存分配的情况 。我们可以把二维数组想象成是一维数组的数组,比如 int [][] arr = new int [2][3];
这表示创建一个 2 行 3 列的数组,可以看成是 int[0] = new int[3] int[1] = new int[3]; 这样两个一维数组 。或许看看图片能刚好的理解,这里放几张来自百度的数组在内存中的分配图 。
看到这里应该也明白了为什么会有索引了吧,因为没有索引根本定位不到具体的值呀 !
下面就来看一下数组的常用操作 。
1 /** 2 数组的声明与创建 3 */ 4 5 String [] arr; 6 int arr1[]; 7 String[] array=new String[5]; 8 int score[]=new int[3]; 9 10 /** 11 数组赋值 12 */ 13 14 //初始化时赋值 15 int arr2[]=new int[]{1,2,3,4,5}; 16 String[] array1={"马超","马云","关羽","刘备","张飞"}; 17 String[] array2=new String[]{"黄渤","张艺兴","黄磊"}; 18 int score[]=new int[3]; 19 //动态赋值 20 for(int i=0;i<score.length;i++) 21 { 22 score[i]=i+1; 23 } 24 25 /** 26 打印数组 27 */ 28 29 int[] arr = { 1, 2, 3, 4, 5 }; 30 String arrString = Arrays.toString(arr); 31 32 // 直接输出,为内存地址 33 System.out.println(arr); 34 // [I@139a55 35 36 System.out.println(arrString ); 37 // [1, 2, 3, 4, 5] 38 39 /** 40 int 数组转成 string 数组 41 */ 42 43 int[] array3={1,2,3,4,5,6,7,8,9,0}; 44 String arrStrings=Arrays.toString(array3); 45 46 /** 47 数组转成 list 集合 48 */ 49 50 String[] array2 = new String[]{"黄渤","张艺兴","孙红雷","黄磊"}; 51 //方法 1 52 List<String> list=new ArrayList<String>(); 53 for (int i = 0; i < array2.length; i++) { 54 list.add(array2[i]); 55 } 56 57 String[] arrStrings2={"1","2","3"}; 58 //方法 2 59 List<String > list2=java.util.Arrays.asList(arrStrings2); 60 61 /** 62 检查数组中是否包含某一个值 63 */ 64 65 String a="马超"; 66 String[] array1={"马超","马云","关羽","刘备","张飞"}; 67 if (Arrays.asList(array1).contains(a)) { 68 System.out.println("马超在这里"); 69 } 70 71 /** 72 数组转成 set 集合 73 */ 74 75 String[] array2=new String[]{"黄渤","张艺兴","孙红雷","黄磊"}; 76 Set<String> set=new HashSet<String>(Arrays.asList(array2)); 77 78 /** 79 数组的排序 sort() : 从小到大排序 。下一节总结一下排序的算法 。 80 */ 81 82 //方法 1 83 int[] arr4 = {3, 7, 2, 1, 9}; 84 Arrays.sort(arr4); // sort(int[] a) 放入数组名字 85 for (int i = 0; i < arr4.length; i++) { 86 System.out.println(arr4[i]); 87 } 88 //方法 2 89 int[] arr5 = {3, 7, 2, 1, 9,3,45,7,8,8,3,2,65,34,5}; 90 Arrays.sort(arr5, 1, 4); // sort(a, fromIndex, toIndex) 从第几个到第几个之间的进行排序 91 92 /** 93 数组的复制 94 */ 95 96 //方法 1 97 int[] arr6 = {3, 7, 2, 1}; 98 int[] arr7=Arrays.copyOf(arr6, 10); //指定新数组的长度 99 //方法 2 100 int[] arr8=Arrays.copyOfRange(arr6, 1, 3); //只复制从索引[1]到索引[3]之间的元素(不包括索引[3]的元素) 101 for (int i = 0; i < arr8.length; i++) { 102 System.out.println(arr8[i]); 103 } 104 105 // 比较两个数组 106 boolean arr10=Arrays.equals(arr6, arr9); 107 108 /** 109 数组的去重 110 */ 111 112 int[] arr11 = {1, 2, 3, 4,5,6,7,8,9,0,3,2,4,5,6,7,4,32,2,1,1,4,6,3}; 113 //利用set的特性(无序不重复) 114 Set<Integer> set2=new HashSet<Integer>(); 115 for (int i = 0; i < arr11.length; i++) { 116 set2.add(arr11[i]); 117 } 118 System.out.println(set2); 119 int[] arr12 = new int[set2.size()]; 120 int j=0; 121 for (Integer i:set2) { 122 arr12[j++]=i; 123 } 124 System.out.println(Arrays.toString(arr12));