首页 > 技术文章 > 2013.8.7Java语言基础——数组

grape 2013-08-07 20:25 原文

  数组是数据类型一致的变量的集合。

一个:变量

一堆(多个):数组

数组语法:

1)数组变量(引用类型变量)

  数组变量通过引用地址引用了数组(数组对象)

2)数组(数组对象)

  数组就是个体,是一个整体

  数组元素的个数叫数组的长度length

  数组元素的范围:0 1 2…length-1

3)数组元素

  是数组中的每个变量,使用[下标]访问

  1. 定义数组变量;
  2. 创建数组(数组对象)
  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 }

 

 

 

 

 

 

推荐阅读