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学习之数组的主要内容,如果未能解决你的问题,请参考以下文章