Java初级学习(十)Java数组

1.数组的定义

相同数据类型的数据的有序集合

特点:

1)数组的长度是固定的,数组一旦被创建,长度不可以改变;

2)数组中的元素的数据类型可以是任何类型,包括基本类型和引用类型

3)数组变量是引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的。

2.数组的声明与创建

1)写法一

声明:

dataType[] arrayRefVar;     //首选

dataType arrayRefVar1[]; //效果相同,但不是首选,是c,c++的风格

创建:

arrayRefVar=new dataType[10];

例子:

int[] nums; //声明数组
nums =new int[10]; //创建数组

2)写法二

声明和创建:

dataType[] arrayRefVar=new dataType[arraySize];

例子:

int[] nums = new int[10];

3)最常用,直接静态初始化

int[] array = {1,2,3,4,5,6,7,8,9,10};


 1 public class Demo02 {
 2     public static void main(String[] args) {
 3         //变量类型  变量名=变量值
 4         //int[] nums; //声明数组
 5         //nums =new int[10];  //创建数组
 6         int[] nums = new int[10];   //声明+创建一个包含10个数的数组
 7         nums[0]=1;  //数组下标从0开始,代表给数组的第一个元素赋值
 8         nums[1]=2;  //给数组的第二个元素赋值
 9         nums[2]=3;
10         nums[3]=4;
11         nums[4]=5;
12         nums[5]=6;
13         nums[6]=7;
14         nums[7]=8;
15         nums[8]=9;
16         nums[9]=10;
17 
18         int sum=0;
19         //求数组所有元素的和
20         for (int i=0;i<=nums.length;i++){
21             sum=sum+i;
22         }
23         System.out.println(sum);
24     }
25 }

3.内存分析

Java内存

1)堆:存放new的对象和数组;可以被所有线程共享,不会存放别的对象引用

2)栈:存放基本变量类型(会包含这个基本类型的具体数值);引用对象的变量(会存放这个引用在堆里面的具体地址)

3)方法区:可以被所有的线程共享;包含了所有的class和static变量

 

4.数组的三种初始化

 1 public class Demo03 {
 2     public static void main(String[] args) {
 3         //静态初始化:创建+赋值
 4         int a[]={1,2,3};
 5         System.out.println(a[0]);
 6 
 7         //动态初始化,包含默认初始化
 8         int[] b = new int[3];
 9         b[0]=1;
10         b[1]=2;
11         System.out.println(b[0]);
12 
13         //默认初始化,c[0]的默认值是int的默认值0
14         int[] c = new int[3];
15         System.out.println(c[0]);
16     }
17 }

 

5.数组下标越界

报错信息为:ArrayIndexOutOfBoundsException

数组下标的范围为:[0 ~ length-1]

1         int a[]={1,2,3};
2         System.out.println(a[0]);
3         //数组下标越界
4         System.out.println(a[4]);      //报错ArrayIndexOutOfBoundsException

 

6.数组的使用例子

1)for循环遍历数组,打印数组元素,计算和,查找最大数

 

 1 package com.rzd.Method;
 2 
 3 public class Demo04 {
 4     public static void main(String[] args) {
 5         int[] array = {1,2,3,4,5,6,7,8,9,10};
 6 
 7         //打印全部的数组元素,也就是遍历数组
 8         for (int i=0;i<array.length;i++){
 9             System.out.print(array[i]+"\t");
10         }
11         System.out.println();
12 
13         //增强for循环遍历数组,array表示该数组,i表示数组中的每一个元素。适合遍历,但取不到数组的下标
14         for (int i : array) {
15             System.out.print(i+"\t");
16         }
17         System.out.println();
18         
19         //计算数组所有元素的和
20         int sum=0;
21         for (int i=0;i<array.length;i++){
22             sum+=array[i];   //sum=sum+array[i];
23         }
24         System.out.println(sum);
25 
26         //查找数组的最大元素
27         int max=array[0];
28         for (int i=0;i<array.length;i++){
29             if (array[i]>max){
30                 max=array[i];
31             }
32         }
33         System.out.println(max);
34 
35         //
36     }
37 
38 }

 2)数组作为方法的入参,反转数组

 1 public static void main(String[] args) {
 2         int[] newarrays={1,2,3,4};
 3         printarray(newarrays);
 4         System.out.println();
 5         //reverse(newarrays)调用reverse方法,并将newarrays作为参数传入。然后创建一个数组reverse来接收
 6         int[] reverse = reverse(newarrays);
 7         //调用printarray方法来打印reverse[]
 8         printarray(reverse);
 9 
10     }
11     //打印数组元素,数组作方法入参
12     public static void printarray(int[] arrays){
13         for (int i=0;i<arrays.length;i++){
14             System.out.print(arrays[i]+" ");
15         }
16     }
17 
18     //数组作为返回值,用于反转数组
19     /*public static int[]中的int[]表示返回值类型是数组类型
20       reverse:反转的意思
21       (int[] arrays)该方法的参数是一个数组
22      */
23     public static int[] reverse(int[] arrays){
24         //先定义一个数组,这个数组是要返回的数组,这个数组的长度与arrays的长度相等
25         int result[]=new int[arrays.length];
26 
27         //反转,注意这里int i=0,j=arrays.length-1;中间是逗号不是分号,i++,j--中间也是。
28         for (int i=0,j=arrays.length-1;i < arrays.length; i++,j--){
29             result[j] = arrays[i];
30         }
31         return result;
32     }

 

7.二维数组

定义二维数组:表示三行两列的数组

int a[][]=new int[3][2];

 

 1 public class Demo05 {
 2     public static void main(String[] args) {
 3         int[][] array={{1,2},{3,4},{5,6}};
 4 
 5         //for遍历数组
 6         //遍历二维数组,array[i].length表例如array[0]={1,2},它的长度是2
 7         for (int i = 0; i < array.length; i++) {
 8             for (int j = 0; j < array[i].length; j++) {
 9                 System.out.print(array[i][j]+"\t");
10             }
11         }
12         System.out.println();
13         //for-each遍历数组
14         for (int[] ints : array) {
15             for (int anInt : ints) {
16                 System.out.print(anInt+"\t");
17             }
18         }
19     }
20 }

 

8.Arrays类

如何查找一个类的所有方法

1)先输入这个类,并导入这个类的包

 

 2)鼠标放置在Arrays上按住Ctrl,点进去查看这个类的源码

 

 3)点击IDE右下角的structure

 

 4)然后可以看到这个类的所有方法

 

 Array类有几种常用的方法

1)打印数组元素

2)数组排序

3)填充数组

 1 import java.util.Arrays;
 2 
 3 //Arrays类
 4 public class Demo06 {
 5     public static void main(String[] args) {
 6         int a[]={1,22,3,44,555,90};
 7 
 8         System.out.println(a);  //[I@119d7047   这里只能打印出这个数组的哈希
 9         //打印数组元素
10         System.out.println(Arrays.toString(a));
11         //用下面自己写的方法打印数组元素
12         printArray(a);
13 
14         //对数组进行排序
15         Arrays.sort(a);
16         System.out.println(Arrays.toString(a));
17 
18         //给数组填充,将第2个数到第4个数的值赋为1000,这里2到4是左闭右开[2,4)
19         Arrays.fill(a,2,4,1000);
20         System.out.println(Arrays.toString(a));
21     }
22     //自己写一个打印数组的方法,使它的效果和Array.toString()效果一样
23     public static void printArray(int[] a){
24         for (int i = 0; i < a.length; i++) {
25             if (i==0){
26                 System.out.print("[");
27             }
28             if (i==a.length-1){
29                 System.out.println(a[i]+"]");
30             }else {
31             System.out.print(a[i]+", ");
32             }
33         }
34     }
35 }

 

 9.冒泡排序

 两层循环,外层冒泡轮数,里层依次比较

 

 1 import java.util.Arrays;
 2 //冒泡排序
 3 public class Demo08 {
 4     public static void main(String[] args) {
 5         int[] array={17,5,20,8,11};
 6         //输出原数组
 7         System.out.println(Arrays.toString(array));
 8 
 9         //对数组进行冒泡排序
10         int temp=0;
11         for (int i = 0; i < array.length - 1; i++) {
12             for (int j = 0; j < array.length - 1 - i; j++) {
13                 if (array[j]<array[j+1]){
14                     temp=array[j];
15                     array[j]=array[j+1];
16                     array[j+1]=temp;
17                 }
18             }
19         }
20         System.out.println();
21         for (int num : array) {
22             System.out.print(num+"\t");
23         }
24     }
25 }

 

冒泡排序程序运行详解:

//在这个方法里详解冒泡排序
    public void maopaopaixu(){
        int[] array={17,5,20,8,11};

        int temp=0;
        /*
        1.外层控制比较的轮数,内层控制每轮比较的次数。
        那么就是比较4轮(array.length - 1),i为0, 1, 2, 3。每一轮比较的次数依次为(array.length - 1 - i):
        第一轮:i=0, j<4; j可以为0, 1, 2, 3
        第二轮:i=1, j<3; j可以为0, 1, 2
        第二轮:i=2, j<2; j可以为0, 1
        第二轮:i=3, j<1; j可以为0

        2.程序运行过程
        此时数组为:
        a[0]    a[1]    a[2]    a[3]    a[4]
         17       5      20      8       11
        判断a[j]是否 < a[j+1]
        第一轮:
        第一次比较:i=0, j=0, a[0]<a[1]  17<5  false, 无操作。
        第二次比较:i=0, j=1, a[1]<a[2]  5<20  true, 交换a[1] a[2]。=====>17   20   5   8   11
        第三次比较:i=0, j=2, a[2]<a[3]  5<8   true, 交换a[2] a[3]。=====>17   20   8   5   11
        第四次比较:i=0, j=3, a[3]<a[4]  5<11  true, 交换a[3] a[4]。=====>17   20   8   11   5
        第一轮比较结束,由于这里已经比较了a[3] a[4],交换后a[3]一定是>a[4]的,所以下一轮就少一次比较。

        此时数组为:
        a[0]    a[1]    a[2]    a[3]    a[4]
        17       20       8       11      5
        第二轮:
        第一次比较:i=1, j=0, a[0]<a[1]  17<20  true, 交换a[0] a[1]。=====>20   17   8   11   5
        第二次比较:i=1, j=1, a[1]<a[2]  17<8  false, 无操作。
        第三次比较:i=1, j=2, a[2]<a[3]  8<11  true, 交换a[2] a[3]。=====>20   17   11   8   5

        此时数组为:
        a[0]    a[1]    a[2]    a[3]    a[4]
         20      17      11       8      5
        第三轮:
        第一次比较:i=2, j=0, a[0]<a[1]  20<17  false, 无操作。
        第二次比较:i=2, j=1, a[1]<a[2]  17<11  false, 无操作。

        此时数组为:
        a[0]    a[1]    a[2]    a[3]    a[4]
         20      17      11       8      5
        第三轮:
        第一次比较:i=3, j=0, a[0]<a[1]  20<17  false, 无操作。

        经过以上4轮比较,可以得到冒泡排序的结果。
         */
        for (int i = 0; i < array.length - 1; i++) {
            for (int j = 0; j < array.length - 1 - i; j++) {
                if (array[j]<array[j+1]){
                    temp=array[j];
                    array[j]=array[j+1];
                    array[j+1]=temp;
                    /*想要交换a b 两个数,要先创建一个c。
                    1)将a的值赋给c,c=a
                    2)将b的值赋给a,a=b,此时a的值已经取到了b
                    3)将c=a的值赋给b,b=c=a,此时b的值已经取到了a
                    结束
                     */
                }
            }
        }
    }

 

 

 10.稀疏数组

当一个数组中大部分元素为0,或者为同一值时,可以使用稀疏数组来保存该数组。

例子

//原始数组,这是一个6行7列的数组,共有8个有效数字,其余都是0
0 0 0 22 0 0 15
0 11 0 0 0 17 0
0 0 0 -6 0 0 0
0 0 0 0 0 39 0
91 0 0 0 0 0 0
0 0 28 0 0 0 0

//稀疏数组
行 列 值
[0] 6 7 8 //第一行存放的是这个数组有6行,7列,8个有效数字
[1] 0 3 22 //第二行存放的是第一个有效数字,它的位置是0行、3列,值是22
[2] 0 6 15 //第二行存放的是第二个有效数字,它的位置是0行,6列,值是15
[3] 1 1 11 //以此类推
[4] 1 5 17
[5] 2 3 -6
[6] 3 5 39
[7] 4 0 91
[8] 5 2 28

练习:一个原始数组如下,用稀疏数组表示:

 

//11行11列的数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0
0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0

//那么它的稀疏数组为
11 11 2
1 2 1
2 3 2

 

 1 public class Demo07 {
 2     public static void main(String[] args) {
 3         //先构造一个原始的数组
 4         int[][] array=new int[11][11];
 5         array[1][2]=1;
 6         array[2][3]=2;
 7         //然后用循环打印出这个二位数组
 8         System.out.println("原始数组为:");
 9         for (int[] ints : array) {  //输入array.for
10             for (int anInt : ints) {    //输入ints.for
11                 System.out.print(anInt+"\t");
12             }
13             System.out.println();
14         }
15         //转换为稀疏数组
16         //查找有多少个有效值
17         int sum=0;
18 //        for (int[] ints : array) {
19 //            for (int anInt : ints) {
20 //                if (anInt!=0){
21 //                    sum++;
22 //                }
23 //            }
24 //        }
25         //for循环写法
26         for (int i = 0; i < array.length; i++) {
27             for (int j = 0; j < array[i].length; j++) {
28                 if (array[i][j]!=0){
29                     sum++;
30                 }
31             }
32         }
33         System.out.println("数组中的有效值个数为:"+sum);
34 
35         //构造稀疏数组
36         int[][] array1=new int[sum+1][3];   //稀疏数组的行数为有效值的个数+1,也就是加上第一行。列固定为3
37         //稀疏数组第一行
38         array1[0][0]=11;
39         array1[0][1]=11;
40         array1[0][2]=sum;
41 
42         //取有效值,构造稀疏数组第一行下面的行
43         int count=0;    //表示稀疏数组的行数
44         for (int i = 0; i < array.length; i++) {
45             for (int j = 0; j < array[i].length; j++) {
46                 if (array[i][j]!=0){
47                     count++;
48                     array1[count][0]=i;
49                     array1[count][1]=j;
50                     array1[count][2]=array[i][j];
51                 }
52             }
53         }
54         //输出稀疏数组
55         System.out.println("稀疏数组为:");
56         for (int[] ints : array1) {  //输入array.for
57             for (int anInt : ints) {    //输入ints.for
58                 System.out.print(anInt+"\t");
59             }
60             System.out.println();
61         }
62 
63         //还原稀疏数组,也就是根据上面的稀疏数组重新构建一个原始数组
64         System.out.println("还原为原始数组:");
65         int[][] array2=new int[array1[0][0]][array1[0][1]];
66         for (int i = 1; i < array1.length; i++) {
67             array2[array1[i][0]][array1[i][1]]=array1[i][2];
68             }
69         for (int[] ints : array2) {  //输入array.for
70             for (int anInt : ints) {    //输入ints.for
71                 System.out.print(anInt+"\t");
72             }
73             System.out.println();
74         }
75     }
76 }

 

 

 11.数组排序算法

 

 


posted @ 2021-06-30 08:46  阮真冬  阅读(232)  评论(0)    收藏  举报