数组用来存储一个元素个数固定且元素类型相同的有序集。
一维数组 声明数组变量: //一、元素类型[] 数组引用变量;(推荐使用) int[] myArray; //二、元素类型 数组引用变量[]; int myArray[]; 创建数组:不同于基本数据类型变量的声明,声明一个数组变量时并不在内存中给数组分配任何空间,只是创建了一个对数组的引用的存储位置。声明变量后,可以使用下面语法创建数组:这条语句做了两件事:1)使用new int[8]创建一个数组;2)把创建的数组的引用赋值给变量myArray。 myArray = new int[8];//定义数组长度为8 声明、创建、引用赋值合并为一条语句: int[] myArray = new int[8]; 匿名数组的创建 //new 数据类型[] {值0,值1,值2,……,值n} printArray(new int[]{2,4,5,2,8}); public static void printArray(int[] array){ for (int i : myArray) { System.out.print(i+""); }数组的大小和默认值:给数组分配空间时,必须指定该数组能够存储的元素个数来确定数组大小,数组创建后不能修改它的大小。数组创建后被赋予默认值,数值型基本数据类型的默认值为0,char型的默认值为‘\u0000’,boolean型的默认值为false。数组下标变量:数组元素可以通过下标访问,下标基于0,范围从0开始到array.length-1结束。数组初始化: //声明数组、创建数组、初始化数组合并到一句:元素类型[] 数组引用变量 = {key1,key2,...,keyn} int[] myArray = {1,2,3,4,,5,6}; 数组处理: for循环遍历: int[] myArray = {1,2,4,5,7,8,8}; for (int i = 0; i < myArray.length; i++) { System.out.println(myArray[i]); } 使用随机数初始化数组: int[] myArray = new int[8]; for (int i = 0; i < myArray.length; i++) {//初始化为0到100(不包括)之间的随机整数 myArray[i] = (int)(Math.random()*100); System.out.println(myArray[i]); } 数组的显示:为了打印数组,必须使用类似以下的循环,打印数组中每个元素。(对于char[]类型的数组,直接使用 System.out.print(sourceArray)就可以,其他类型的数组打印出来是引用的地址)。 int[] sourceArray = {1,2,3,4,5,6}; for (int i = 0; i < sourceArray.length; i++) { System.out.print(sourceArray[i]+""); } 打乱数组元素顺序: //针对每个元素myArray[i],随意产生一个下标index,然后将myArray[i]和myArray[index]交换 for (int i = 0; i < myArray.length; i++) { int index = (int)(Math.random()*myArray.length); int tmp = myArray[i]; myArray[i] = myArray[index]; myArray[index] = tmp; }
数组的复制:进行数组赋值时,可能会想到使用赋值语句(=),如下所示:该语句并不能将array1引用的数组内容赋值给array2,而只是将array1的引用值复制给了array2。在这条语句之后,两个数组都指向同一个数组的引用, array2 = array1;
在Java中,可以使用赋值语句复制基本数据类型的变量,但不能复制数组。将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用赋值给另一个变量,使两个变量都指向相同的内存地址。
复制数组有三种方法:
1)使用循环语句逐个的复制数组的元素: int[] sourceArray = {1,2,3,4,5,6}; int[] targetArray = new int[sourceArray.length]; for (int i = 0; i < sourceArray.length; i++) { targetArray[i] = sourceArray[i]; } 2)使用System类中的静态方法(java.lang.System包)arraycopy,arraycopy的语法如下(arraycopy方法没有给目标数组分配内存空间,复制前必须创建目标数组以及分配给它的内存空间): /* 参数src_pos和tar_pos分别表示在源数组sourceArray和目标数组targetArray中的起始位置,从sourceArray复制到targetArray中的元素个数由参数length指定。 **/ System.arraycopy(sourceArray,src_pos,targetArray,tar_pos,length); 3)使用clone方法复制数组 数组在方法中的传递:java使用值传递的方式将实参传递给方法,传递基本数据类型变量的值与传递数组值有很大区别: 对于基本数据类型参数,传递的是实参的值;对于数组类型参数,传递的是数组的引用(类似于C语言中的指针),所以,在方法中改变数组的内容,会看到方法外的数组也发生变化。 从方法中返回数组: int[] myArray = {1,2,4,5,7,8,8}; int[] myArray2 = reverse(myArray); //反序输出数组 private static int[] reverse(int[] array) { int[] result = new int[array.length]; for (int i = 0,j = result.length-1; i < result.length; i++,j--) { result[j] = array[i]; } return result; } 统计字符数组中每个字符出现的次数: public static void main(String[] args) { char[] array = getRandomCaseLetter(100); System.out.println(array); int[] counts = countLetters(array); for (int i : counts) { System.out.print(i+" "); } } /* * 统计每个字符出现的次数 */ private static int[] countLetters(char[] array) { int counts[] = new int[26]; for (int i = 0; i < array.length; i++) { counts[array[i]-'a'] ++; } return counts; } /* * 产生长度为length的小写字母组成的随机字符数组 * */ private static char[] getRandomCaseLetter(int length) { char[] array = new char[length]; for (int i = 0; i < array.length; i++) { array[i] = (char)('a'+ Math.random()*('z'-'a'+1)); } return array; }
将字符数组转换成字符串:
char[] chs = {'2','3','5'}; String seq = String.valueOf(chs);