数组的概念
1、什么是数组
数组是相同数据类型元素的集合。创建数组的时候,Java就会再内存中分配一段连续的空间来存放数组的内容。每一个数组内容都有自己的编号,这个编号从0开始的,也就是数组的下标从0开始。通过数组的下标来访问数组的内容。另外数组也是一种数据类型,是引用数据类型。
2、数组的声明
数据类型[] 数组名; //推荐使用第一种方式
数据类型 数组名[];
声明的时候,jvm没有为该数组分配存储空间,
声明一个数组的时候,该数组没有被创建
3、数组的初始化
1、静态初始化
int[] arr ={1,2,3,4}
int[] arr =new int[]{1,2,3,4}
2、动态初始化
int[] arr=new int[10]
3、扩展方法
Arrays.fill
快速初始化,填充一个数组
java中的数组初始值都为零,若快速填充一个其他值的数组,即将数组批量填充相同的值,可以用 Arrays.fill 方法,但只能填充一个一维数组,多维数组还得用循环。
代码示例:
import java.util.Arrays;
public class HelloWorld {
public static void main(String[] args) {
int[] arr = new int[5];
Arrays.fill(arr, 1);
System.out.println(Arrays.toString(arr)); // [1, 1, 1, 1, 1]
}
}
默认的初始化
数组类型 | 默认初始化的值 |
---|---|
整型(byte short int long) | 0 |
浮点型(float double ) | 0.0 |
字符型(char) | /u0000 |
布尔类型(boolean) | false |
引用数据类型 | null |
4、数组的特点
1.长度是确定。数组一旦创建,它的大小不可以改变的
2. 元素必须是相同的数据类型,不允许出现混合类型
3. 数组数据类型可以是任何数据类型.包括基本数据类型和引用数据类型
5、数组的访问
-
数组名[索引] = 数值,为数组中的元素赋值
-
变量 = 数组名[索引],获取出数组中的元素
public static void main(String[] args) { //定义存储int类型数组,赋值元素1,2,3,4,5 int[] arr = {1,2,3,4,5}; //为0索引元素赋值为6 arr[0] = 6; //获取数组0索引上的元素 int i = arr[0]; System.out.println(i); //直接输出数组0索引元素 System.out.println(arr[0]); }
6、数组的遍历
就是将数组中的每个元素分别获取出来,就是遍历。
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
System.out.println(arr[4]);
}
for循环遍历
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
foreach 遍历
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
for (int i : arr) {
System.out.println(i);
}
}
数组的内存
内存的概述
内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。 Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。
java虚拟机中内存的划分
区域名称 | 作用 |
---|---|
寄存器 | 给CPU使用,和我们开发无关。 |
本地方法栈 | JVM在使用操作系统功能的时候使用,和我们开发无关。 |
方法区 | 存储可以运行的class文件。 |
堆内存 | 存储对象或者数组,new来创建的,都存储在堆内存。 |
方法栈 | 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。 |
数组在内存的存储
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr); // [I@5f150435
}
以上方法执行,输出的结果是[I@5f150435,这个就是数组在内存中的地址。new出来的内容,都是在堆 内存中存储的,而方法中的变量arr保存的是数组的地址。
程序执行流程:![在这里插入图片描述](https://img-blog.csdnimg.cn/97a0571be8f84e69909c046f3f706430.png#pic_center)
1、main方法进入方法栈执行
2、创建数组,JVM会在堆内存中开辟空间,存储数组
3、数组在内存中会有自己的内存地址,以十六进制数表示
4、数组中有3个元素,默认值为0
5、JVM将数组的内存地址赋值给引用类型变量array
6、变量array保存的是数组内存中的地址,而不是一个具体数值,因此称为引用数据类型。
数组的异常
越界异常
public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arr[3])
}
创建数组,赋值3个元素,数组的索引就是0,1,2,没有3索引,因此我们不能访问数组中不存在的索引,程序运行后,将会抛出 ArrayIndexOutOfBoundsException 数组越界异常。
空指针异常
public static void main(String[] args) {
int[] arr = {1,2,3};
arr = null;
System.out.println(arr[0]);
}
arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候 会抛出 NullPointerException 空指针异常。
数组常用的API
1、输出数组(Arrays.toString())
int[] array = { 1, 2, 3 };
System.out.println(Arrays.toString(array));
2、数组转List或set(Arrays.asList())
//数组转List
String[] array2 = {"a", "b", "c", "d"};
System.out.println(array2); // [Ljava.lang.String;@13b6d03
List list = new ArrayList(Arrays.asList(array2));
System.out.println(list); // [a, b, c, d]
list.add("GG");
System.out.println(list); // [a, b, c, d, GG]
//数组转set
String[] array = { "a", "b", "c", "d", "e" };
Set set = new HashSet(Arrays.asList(array));
System.out.println(set)
3、 List转数组 (toArray())
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
String[] array = new String[list.size()];
list.toArray(array);
for (String s : array)
System.out.println(s);
4、数组中是否包含某个值
String[] array = { "a", "b", "c", "d", "e" };
boolean isEle = Arrays.asList(array).contains("a");
System.out.println(isEle);
使用数组的注意事项
1、数组是多个相同类型数据的组合,实现对这些数据的统一管理
2、数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
3、数组创建后,如果没有赋值,有默认值
int 0,short 0, byte 0, long 0, float 0.0,double 0.0,
char \u0000,boolean false,String null
4、使用数组的步骤 1. 声明数组并开辟空间 2 给数组各个元素赋值 3 使用数组
5、数组的下标是从 0 开始的。
6、数组下标必须在指定范围内使用,否则报:下标越界异常
7、数组属引用类型,数组型数据是对象(object)