Java学习03

四、数组

1、数组的定义

数组当中数据类型必须统一,运行期间不可改变。
创建数组之后不能修改数组的大小。

(1) 动态初始化(指定长度)

int[] arrayA = new int[300];//动态初始化基本格式

(2) 静态初始化(指定内容)直接给内容

int[] arrayA = new int[] {5,25,25};

(3) 省略格式(静态初始化)

int[] arrayA ={10,20,30};

(4) 静态、动态初始化可以分两步写

int[] arrayB;
arrayB=new int[]{112,21,23};

int[] arrayC;
arrayC=new int[5];

注意,分两步必须写new,不能省略。

int[] arrayB;
arrayB={112,21,23};//错误!!!!!!!!!!!!!

2、数组的访问、赋值

(1)数组访问:下标从0开始

array[0]               //下标从0开始
array   //返回地址的哈希值

(2)赋值

动态初始化会给定默认值

  • 整数类型:0
  • 浮点类型:0.0
  • 字符类型:'\u0000'
  • 布尔类型:false
  • 应用类型:null
array[1] =123;\\赋值格式

(3)java数组内存分析

Java的内存需要划分成为5个部分:

  • 1)栈(Stack):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。
        局部变量:方法的参数,或者是方法(内部的变量
        作用域:一旦超出作用域,立刻从栈内存当中消失。
  • 2)堆(Heap)︰凡是new出来的东西,都在堆当中。
        堆内存里面的东西都有一个地址值:16进制
        堆内存里面的数据,都有默认值,参考数组默认值。
  • 3)方法区(Method Area):存储.class相关信息,包含方法的信息。
  • 4)本地方法栈(Native Method Stack):与操作系统相关。
  • 5)寄存器(pc register): 与CPU相关。
单个数据内存示意图
两个数据内存示意图
两个指向同一个数组
int[] arrayC = array;
System.out.println(arrayC[0]);
arrayC[1]=2222;
System.out.println(array[1]);//array[1]变为2222

注意:arrayC的操作会影响array!!!!

3、常见异常

(1)越界异常

int[] arrayA = new int[] {5,25,25};
System.out.println(arrayA[3]);

下标只到2,超出范围

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

(2)空指针

int[] arrayB =null;
System.out.println(arrayB[1]);

空指针报错

Exception in thread "main" java.lang.NullPointerException: Cannot load from int array because "arrayB" is null

4、二维数组

(1)二维数组定义

两种声明方式:

int arr1[][]; \\数组元素类型 数组名字[][];
float[][] arr2; \\数组元素类型[][] 数组名字;

常用第一种

(2)二维数组赋值与查询

每一行都是一个数组

public class a {
    public static void main(String[] args) {
        /* 第一种方式 */
        int arr1_0[][] = { { 1, 3, 5 }, { 5, 9, 10 } }; //指定元素,长度相同,new int[][]省略。
        int arr1_1[][];
        arr1_1 =new int[][] { { 1, 3, 5 }, { 5, 9, 10 } };
        /* 第二种方式 */
        int arr2[][] = new int[][] { { 65, 55, 12 }, { 92, 71 } }; //可以不等长
        /* 第三种方式 */
        int arr3[][] = new int[2][3]; // 先给数组分配内存空间
        arr3[0] = new int[] { 6, 54, 71 }; // 给第一行分配一个一维数组
        arr3[1][0] = 1; // 给第二行第一列赋值为1
        arr3[1][1] = 2; // 给第二行第二列赋值为2
        arr3[1][2] = 3; // 给第二行第三列赋值为3
        /* 第四种方式  不规则数组*/
        int arr4[][] = new int[2][]; // 可以不先指定列数,每一行列数可以不同
        arr4[0] = new int[] { 6, 54, 71 }; // 第一行分配3个元素
        arr4[1] = new int[] { 6, 54 }; // 第一行分配2个元素
    }
}

错误方式:没有声明行的数量

int arr1[][] = new int[][];
int arr2[][] = new int[][2];

二维数组读取:

System.out.println(arr4[1]);//返回第一行数组的地址 [I@30946e09
System.out.println(arr4[1][1]);//返回具体元素
System.out.println(arr4.length);//二维数组的行数,2

5、多维数组

建议使用Map、List等集合数据类型

int arr1[][][] = new int[2][3][4];//创建三维数组
float arr2[][][][] = new char[6][7][8][9];//创建四维数纹
double arr3[][][][][]= new double[10][11][12][13][14]; // 建五维数组

6、数组的基本操作

(1)数组长度 array.length

运行期间不能改变长度

int[] arrayC = new int[3];
System.out.println(arrayC.length);
arrayC = new int[5];
System.out.println(arrayC.length);

下面是相当于创建了新的数组,只是数据组沿用旧的名字。二维数组长度返回的是行数

(2)遍历输出,普通for循环

System.out.print(arr[i][j]);//不换行输出
System.out.println(arr[i][j]);//换行输出

注意:"" 代表字符串 ''代表字符
二维数组输出例子

public class a {
    public static void main(String[] args) {
        int arr4[][] = new int[2][]; // 可以不先指定列数,每一行列数可以不同
        arr4[0] = new int[] { 6, 54, 71 }; // 第一行分配3个元素
        arr4[1] = new int[] { 6, 54 }; // 第一行分配2个元素
        for (int i=0; i< arr4.length; i++){
            for (int j = 0; j < arr4[i].length; j++) {
                System.out.print(arr4[i][j]+" ");
            }
            System.out.print("\n");
        }
    }
}
\* 输出
6 54 71 
6 54 
*\

(3)遍历输出,foreach

类似于python里的

for i in list:
    pass

例子

public class a {
    public static void main(String[] args) {
        int arr4[][] = new int[2][]; // 可以不先指定列数,每一行列数可以不同
        arr4[0] = new int[] { 6, 54, 71 }; // 第一行分配3个元素
        arr4[1] = new int[] { 6, 54 }; // 第一行分配2个元素
        for (int i=0; i< arr4.length; i++){
            System.out.println("arr4["+i+"]有"+arr4[i].length+"个元素:");
            for (int temp : arr4[i]) {
                System.out.print(temp+" ");
            }
            System.out.println("\n");
        }
    }
\* 输出
arr4[0]有3个元素:
6 54 71 

arr4[1]有2个元素:
6 54 
*\

(4)元素反转

public class a {
    public static void main(String[] args) {
        int arr[] = new int[]{1,2,3}; // 可以不先指定列数,每一行列数可以不同
        for (int min = 0, max =arr.length-1; min < max; min++ ,max--) {
            int temp =arr[min];
            arr[min] = arr[max];
            arr[max] = temp;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }  //   3 2 1
    }
}

(5)填充和替换数组元素

有许多重构语法

Arrays.fill()(int[] a ,int value)
Arrays.fill()(char[] b ,char value)

填充与替换案例

import java.util.Arrays;

public class a {
    public static void main(String[] args) {
        int arr[] = new int[]{1,2,3}; // 替换数组值
        Arrays.fill(arr,4);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }  //   4 4 4
        System.out.print("\n");
        int arr1[] = new int[4]; // 填充空数组
        Arrays.fill(arr1,5);
        for (int i = 0; i < arr1.length; i++) {
            System.out.print(arr1[i]+" ");
        }  //   5 5 5 5
    }
}

(6)数组作为方法参数:

printArray(array);

这里主函数传入的是地址值,方法接收地址值,因此在方法内修改数组,数组会发生永久变化

public static void printArray(int[] array) {
    for (int i = 0; i < array.length; i++) {
        System.out.println(array[i]);
    }
    array[1]=2222;
}

外部数组此时也变化了

(7)数组作为方法返回值,返回多个结果:

public static int[] calculate(int a,int b, int c) {
    int sum= a+b+c;
    int ave=sum/3;
    int[] array = {sum,ave};
    return array;
}

7、练习案例

(1)横竖打印列表

public class a {
    public static void main(String[] args) {
        char arr[][] = new char[4][];
        arr[0] = new char[]{'体','育','课'};
        arr[1] = new char[]{'数','学','课'};
        arr[2] = new char[]{'语','文','课'};
        arr[3] = new char[]{'物','理','课'};
        System.out.println("————横着打印课表————");
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]);
            }
            if(i % 2 ==0){
                System.out.println(";");
            } else{
                System.out.println("。");
            }
        }
        System.out.println("————竖着打印课表————");
        for (int j = 0; j < arr[0].length; j++) {
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i][j]);
            }
            System.out.print("\n");//相当于 System.out.println();
        }
        System.out.println(";。;。");
    }
}

输出为:

————横着打印课表————
体育课;
数学课。
语文课;
物理课。
————竖着打印课表————
体数语物
育学文理
课课课课
;。;。

(2)打印杨辉三角

public class a {
    public static void main(String[] args) {
        //输出10行杨辉三角
        int[][] arr =new int[10][];
        //给杨辉三角赋值
        for (int i = 0; i < arr.length; i++) {
            arr[i] =new int[i+1];
            for (int j = 0; j < arr[i].length; j++) {
                if (i<2) {
                    arr[i][j] = 1;//前两行赋值为1
                } else {
                    if (j==0 || j == (arr[i].length-1)){
                        arr[i][j] =1;
                    } else {
                        arr[i][j] = arr[i-1][j-1] +arr[i-1][j];
                    }
                }
            }
        }
        //输出
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+"\t");//制表符!!好东西
            }
            System.out.println();
        }
    }
}

注意制表符可以保证数字对齐

1   
1   1   
1   2   1   
1   3   3   1   
1   4   6   4   1   
1   5   10  10  5   1   
1   6   15  20  15  6   1   
1   7   21  35  35  21  7   1   
1   8   28  56  70  56  28  8   1   
1   9   36  84  126 126 84  36  9   1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容