Java学习之数组

Posted adil

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习之数组相关的知识,希望对你有一定的参考价值。

一、什么是数组?

  1. 数组是一个存储多个相同类型的数据的容器,实现对这些数据的统一管理

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

  3. 数组属于引用类型,数组型数据是对象,数组中的每个元素相当于该对象的成员变量

二、一维数组

  1. 什么是初始化?

    所谓的初始化就是为数组分配内存空间,并且为每个数组元素赋值

    Java中的数组必须先初始化,然后才能使用

  2. 初始化有几种方式?

    1)动态初始化

      指的是初始化时只指定数组长度,由虚拟机为数组分配初始值

      格式:

        数据类型[] 数组名 = new 数据类型[数组长度];

      例如:

        int[] arr = new int[3];

    2)静态初始化

      指的是初始化时就为数组分配空间并依次对数组元素赋值

      格式:

        数据类型[] 数组名 = new 数据类型[]{元素1,元素2...};//(静态初始化标准格式)

        数据类型[] 数组名 = {元素1, 元素2...};//(静态初始化简化格式)

      例如:

        int[] arr1 = new int[]{1, 2, 3, 4, 5};

        或者

        int[] arr2 = {1, 2, 3, 4, 5};

  3. 注意:数组是引用类型,它的元素相当于类的成员变量,因此数组已经分配空间,其中的每个元素也被按照成员变量同样的方法被隐式初始化,一旦初始化,其长度是不可变的

  4. 初始化默认值问题?

    整型数组  byte / short / int / long  默认值为0

    浮点型数组 float/ double      默认值为0.0

    字符型数组 char           默认值为u0000

    布尔型数组 boolean        默认值为false

  5. 存放数组元素值

    格式:

      数组名[索引]  = 数值

    例如:

      //创建一个数组

      int[] arr = new int[3];

      //依次为数组元素赋值

      arr[0] = 10;

      arr[1] = 20;

      arr[2] = 30;

  6. 取出数组元素

    格式:

      数组名[索引];

    例如:

      //创建一个数组

      int[] arr = {1, 2, 3, 4, 5};

      //我要取出第三个元素(值为3),由于数组的索引是从0开始的,所以第三个元素的索引值为(数组长度-1),即为2

      //将取出的数组元素放到一个变量里存储,以便后续对该结果变量进行相关处理

      int num = arr[2];

      //打印这个值

      System.out.println(num);

  7. 一维数组在内存中的分配

 1 package com.cnblogs;
 2 
 3 import java.util.Arrays;
 4 
 5 public class ArrayDemo1 {
 6     public static void main(String[] args) {
 7         /**
 8          * 动态初始化数组,并依次打印赋值前后的数组
 9          */
10         //动态初始化数组,并为数组分配空间
11         int[] arr1 = new int[3];
12         //打印数组
13         System.out.println(Arrays.toString(arr1));//[0, 0, 0]
14         //分割线
15         System.out.println("----------");
16         //为数组元素赋值
17         arr1[0] = 1;
18         arr1[1] = 2;
19         arr1[2] = 3;
20         //打印数组
21         System.out.println(Arrays.toString(arr1));//[1, 2, 3]
22         //分割线
23         System.out.println("----------");
24                 
25         /**
26          * 静态初始化数组,并打印数组
27          */
28         //静态初始化数组,在定义的同时就为数组元素分配空间并赋值
29         //静态初始化精简版
30         int[] arr2 = {4, 5, 6};
31         //静态初始化标准版
32         //int[] arr2 = new int[]{4, 5, 6};
33         //打印数组
34         System.out.println(Arrays.toString(arr2));//[4, 5, 6]
35     }
36 }

     结果为:

    技术分享图片

技术分享图片

    分析:

    1. 第11行代码  int[] arr1  创建一个int类型的数组,引用变量(数组名)为arr1,此时在栈区中开辟内存空间。

    2. 第11行代码  new int[3]  在堆内存中开辟空间,由于是int类型的数组,所以虚拟机会为每个数组元素赋上默认值0,

    3. 第11行代码  int[] arr1 = new int[3]  将new出来的数组的内存地址值复制给arr1引用变量(数组名),arr1指向堆内存中的new出来的数组。此时,完成了数组的创建以及初始化这一整个流程

    4. 第13行  打印数组(由于没有手动给该数组赋值,所以打印出来的数组元素值都为虚拟机默认给该数组初始化的值0)

    5. 第17-19行  通过引用变量指向该数组,根据索引来为数组元素赋值

    6. 第21行  由于我们通过索引给数组元素赋值了,所以打印出来的结果和第13行打印出来的结果不一样

    7. 后面的同理...

三、二维数组

  1. 什么是二维数组?

    Java实际上没有多维数组,只有一维数组。多维数组可以理解为"数组中的数组"。二维数组本质上是一个一维数组,只是该数组的每个数组元素都是一个一维数组

    注意:其实一维数组和多维数组和二维数组并没有多少区别,没必要把多维数组想的太复杂了

  2. 格式?

    数据类型[][] 数组名 = new 数据类型[二维数组的长度 / 包含的一维数组的个数][每个一维数组的长度];

    例如:

      int[][] arr = new int[3][5];//定义了一个整型的二维数组,其中包含3个一维数组,每个一维数组可以存储5个整数

   3. 获取多维数组的元素

    arr[0];//索引为0的位置上的一维数组

    arr[1][3];//如果要获取具体的元素需要两个下标

   4. 二维数组在内存中的分配

  

 1 package com.cnblogs;
 2 
 3 import java.util.Arrays;
 4 
 5 public class ArrayDemo2 {
 6     public static void main(String[] args) {
 7         /**
 8          * 二维数组动态初始化
 9          */
10         //二维数组初始化
11         String[][] str1 = new String[2][2];
12         
13         str1[0][0] = "鸣人";
14         str1[0][1] = "路飞";
15         str1[1][0] = "一护";
16         str1[1][1] = "柯南";
17         
18         //打印数组
19         System.out.println(Arrays.toString(str1));//[[Ljava.lang.String;@f6b7e0e, [Ljava.lang.String;@5a20d10a]
20 
21         //打印数组
22         for(int i = 0; i < str1.length; i++) {
23             for(int j = 0; j < str1.length; j++) {
24                 System.out.print(str1[i][j] + " ");
25             }
26             System.out.println();
27         }
28         
29         int[][] arr1 = new int[3][];
30         arr1[0] = new int[3];
31         arr1[1] = new int[2];
32         arr1[2] = new int[1];
33         arr1[1][1] = 90;
34         arr1[2][0] = 100;
35         
36         //打印二维数组
37         System.out.println(Arrays.deepToString(arr1));
38     }
39 }

     结果为:

    技术分享图片

  技术分享图片

 

四、数组常见异常

  1. 数组索引越界异常(ArrayIndexOutOfBoundsException)

    当引用变量访问了数组不存在的索引时,就会引发该异常

  2. 空指针异常(NullPointerException)

    1)如果数组名没有指向任何数组对象,即数组的值为null,但依旧使用该数组名访问数组的索引,就会引发该异常

    2)如果一个引用类型的变量没有被赋值,但还是调用了它相关的方法,也会引发该异常

 1 package com.cnblogs;
 2 
 3 import java.util.Random;
 4 
 5 public class ArrayExceptionDemo {
 6     public static void main(String[] args) {
 7         /**
 8          * 空指针异常,数组名没有指向数组对象,所以无法根据索引访问该数组
 9          */
10         int[] arr1 = {1, 2, 3, 4, 5};
11         arr1 = null;
12         System.out.println(arr1[2]);
13         
14         /**
15          * 空指针异常,r没有指向Random对象,所以无法访问Random对象中的nextInt()方法
16          */
17         Random r = new Random();
18         r = null;
19         System.out.println(r.nextInt(10));
20         
21         /**
22          * 数组索引越界异常,arr2数组索引最大为3,没有4索引
23          */
24         int[] arr2 = {1, 2, 3};
25         System.out.println(arr2[4]);
26     }
27 }

五、学习中的感想

  1. 数组的索引是从0开始的

  2. 无论是遍历数组,还是通过for循环创建数组,以及给数组赋值等,一定时刻要注意索引值,不能数组索引越界,也不能少计算错一个索引

  3. 熟悉数组在内存中的分配情况

  4. 熟悉Arrays工具类中的方法,sort(),toString()等常用方法

以上是关于Java学习之数组的主要内容,如果未能解决你的问题,请参考以下文章

Java学习之数组

java学习之面向对象

JAVA基础学习之数组

java初步学习之数组

Java基础学习之暴力求素数用数组返回

java学习之数组的两种常见错误