2013.8.7Java语言基础——数组
数组是数据类型一致的变量的集合。
一个:变量
一堆(多个):数组
数组语法:
1)数组变量(引用类型变量)
数组变量通过引用地址引用了数组(数组对象)
2)数组(数组对象)
数组就是个体,是一个整体
数组元素的个数叫数组的长度length
数组元素的范围:0 1 2…length-1
3)数组元素
是数组中的每个变量,使用[下标]访问
- 定义数组变量;
- 创建数组(数组对象)
- 访问数组元素
1 public class Test { 2 3 public static void main(String[] args) { 4 //1)定义数组变量 5 int[] ary;//声明int[] 数组类型的变量ary 6 int ary1;//也是声明数组变量,但很少使用!!! 7 //System.out.println(ary[0]);//编译错误,ary没有初始化 8 ary = null;//null 空,没有 9 //System.out.println(ary[0]);//运行异常,空指针异常 10 11 //空指针异常发生原因:引用类型的变量值是null,不引用任何对象 12 //当利用引用变量访问属性(数组元素)和方法时,出现空指针异常 13 14 //2)创建数组(创建 数组对象) 15 ary = new int[3];//数组对象有3个元素 16 //创建数组对象(new int[3]),将对象的引用赋值给ary变量 17 //ary就引用了数组对象,这个对象有3个元素 18 System.out.println(ary[0]);//0 19 //System.out.println(ary[3]);//运行异常,数组下标越界 20 //java数组元素是自动初始化的,初始值为零值,各种零值如下: 21 //0 0.0 \u0000 null false 22 double[] d = new double[3]; 23 System.out.println("d[0] = "+d[0]);//d[0] = 0.0 24 char[] c = new char[3]; 25 System.out.println("c[0] = "+c[0]);//c[0] = (看不出显示什么) 26 System.out.println((int)'\u0000');//\u0000的编码值是0 27 String[] s = new String[3]; 28 System.out.println("s[0] = "+s[0]);//s[0] = null(字符串数组初始化是null) 29 boolean[] b = new boolean[3]; 30 System.out.println("b[0] = "+b[0]);//b[0] = false 31 32 //java中数组创建的3种方式 33 //new 类型[长度] 34 //类型是任何类型:基本类型、类类型(String,Integer) 35 //长度:变量或常量值:0~Integer.MAX_VALUE 36 37 //new 类型[]{元素0,元素1,元素2} 38 //直接给出元素,元素直接初始化,元素的个数就是长度 39 ary =new int[]{2,3}; 40 System.out.println(ary[0]);//2 41 42 //静态初始化 43 //类型[] 变量={元素0,元素1,元素2} 44 int[] ary4 = {2,3,4}; 45 //静态初始化“只能用于”声明变量同时初始化! 46 //ary = {4,5,6}//编译错误 47 ary = new int[]{4,5,6};//没有问题 48 49 //new int[length]适合创建不知道具体的元素,数量很多 50 //new int[]{2,3,4}适合已经知道具体元素,元素比较少 51 //{4,5,6}只适合知道元素,并只能使用在声明变量时直接初始化 52 53 //3)访问数组元素 54 //数组元素一旦创建,数组的长度是不可以改变的 55 //使用.length属性可以获取数组的长度 56 //数组不能越界访问,会出现运行异常 57 ary = new int[]{5,6,7}; 58 System.out.println(ary.length); 59 ary[1]++; 60 System.out.println(ary[1]);//7 61 System.out.println(ary[-1]);//运行异常!下标越界 62 //迭代数组元素,迭代数组也称为遍历数组,就是逐一处理元素 63 for(int i=0;i<ary.length;i++){ 64 System.out.println(ary[i]); 65 } 66 } 67 }
使用数组非常有用的API方法
(使用API方法:API方法封装了常用算法功能,使用这些功能简化开发过程,提高开发效率)
Arrays.toString:用于字符串表示数组元素
1 package TestCode; 2 3 import java.util.Arrays; 4 5 public class Test { 6 7 public static void main(String[] args) { 8 String[] str =new String[]{"A","b","c","d"}; 9 System.out.println(Arrays.toString(str));//打印出数组元素[A, b, c, d] 10 }
Arrays.equals:用于比较两个数组内容是否相等(便捷)
1 package TestCode; 2 3 import java.util.Arrays; 4 5 public class Test { 6 7 public static void main(String[] args) { 8 char[] a1 = new char[]{'a','b','c'}; 9 char[] a2 = new char[]{'a','b','c'}; 10 char[] a3 = new char[]{'a','c','d'}; 11 System.out.println(Arrays.equals(a1, a2));//true 12 System.out.println(Arrays.equals(a1, a3));//false 13 } 14 }
Arrays.sort:用于实现数组排序
1 package TestCode; 2 3 import java.util.Arrays; 4 5 public class Test { 6 7 public static void main(String[] args) { 8 char[] a = new char[]{'a','d','f','c','b','g'}; 9 System.out.println(Arrays.toString(a));//[a, d, f, c, b, g] 10 Arrays.sort(a); 11 System.out.println(Arrays.toString(a));//[a, b, c, d, f, g] 12 } 13 }
Arrays.binarySearch:用于实现有序数组 的二分法查找
只能查找排序后的数组,不然得到的结果不稳定
1 package TestCode; 2 3 import java.util.Arrays; 4 5 public class Test { 6 7 public static void main(String[] args) { 8 char[] a = new char[]{'a','d','f','c','b','g'}; 9 int index= Arrays.binarySearch(a, 'c'); 10 System.out.println(index);//-2负数找不到 11 Arrays.sort(a); 12 index= Arrays.binarySearch(a, 'c'); 13 System.out.println(index);//在排序后数组的第2位 14 } 15 }
数组的复制
最常见用途:数组的扩容算法
1 package TestCode; 2 3 import java.util.Arrays; 4 5 public class Test { 6 7 public static void main(String[] args) { 8 int[] ary1 = {4,5,6}; 9 int[] ary2 = ary1;//数组变量的赋值,但数组还是同一个。ary1 ary2互相影响 10 ary2[1]++; 11 System.out.println(Arrays.toString(ary1));//[4, 6, 6] 12 System.out.println(Arrays.toString(ary1));//[4, 6, 6] 13 //数组的复制:1)使用for循环实现 2)使用API 14 //将ary1引用数组进行复制 15 int[] ary3 = new int[ary1.length]; 16 for(int i=0;i<ary1.length;i++){ 17 ary3[i] = ary1[i]; 18 } 19 ary3[1]++; 20 System.out.println(Arrays.toString(ary3));//[4, 7, 6] 21 System.out.println(Arrays.toString(ary1));//[4, 6, 6] 22 //使用API System.arraycopy()实现复制,比较早期,用C写的,性能好 23 int[] ary4 = new int[ary1.length]; 24 //参数:源数组,源数组位置,目标数组,目标数组位置,个数 25 System.arraycopy(ary1, 0, ary4, 0, ary1.length); 26 System.out.println(Arrays.toString(ary1)); 27 System.out.println(Arrays.toString(ary4)); 28 //使用Arrays.copyOf()方法(JDK1.5开始出现),底层就是arraycopy 29 int[] ary5 = Arrays.copyOf(ary1, ary1.length); 30 System.out.println(Arrays.toString(ary1)); 31 System.out.println(Arrays.toString(ary5)); 32 33 } 34 }
数组的扩容 与 追加
1) 数组创建以后长度不可改变
2) 利用更换数组的方式实现扩容算法
3) 更换数组时候,利用复制方法保持原数组内容。
数组扩容是Java API 实现的常用算法!
1 package TestCode; 2 3 import java.util.Arrays; 4 5 public class Test { 6 7 public static void main(String[] args) { 8 // 扩容原理:更换新数组 9 String[] playlist = { "song1", "song2" }; 10 System.out.println(Arrays.toString(playlist)); 11 playlist = new String[] { "song1", "song2", "song3" }; 12 System.out.println(Arrays.toString(playlist)); 13 // 扩容:为playlist扩容并追加 新 歌曲 “song4” 14 playlist = Arrays.copyOf(playlist, playlist.length + 1); 15 playlist[playlist.length - 1] = "song4"; 16 System.out.println(Arrays.toString(playlist)); 17 // 1) 复制新数组(增加容量) 18 // 2) 替换原数组 19 String[] newOne = new String[playlist.length + 1]; 20 System.arraycopy(playlist, 0, newOne, 0, playlist.length); 21 playlist = newOne; 22 System.out.println(Arrays.toString(playlist)); 23 } 24 }