一、数组定义
变量空间是可以存放数据的,但是每一个变量空间只能存放一个数据。如:int s = 111;
1、数组的概念
数组是同一种
类型数据的集合;即能够存放多个相同类型的数据
的容器。
2、数组的定义方式
数组是存放多个数据的容器,java中需要使用new
关键字来创建容器,在创建容器时也要明确容器的大小,即容器中存放数据个数。有以下格式:
new :会创建引用型的数据,也会在堆中开辟空间。
元素类型[] 数组名 = new 元素类型[元素个数或数组长度] ;
int[] arr = new int[3];
//通过new关键字创建了一个长度为3,元素类型是int的数组实体。
3、数组用途
数组可以**储存多个数据,而且可以对数据进行编号。**从0开始,操作元素完成可以通过编号(索引)
完成。
int[] arr = new int[3]; //通过new关键字创建了一个长度为3,元素类型是int的数组实体。
arr[0] = 3; //给数组编号(角标)为0的空间存放int类型的常量值3
System.out.println(arr[1]); //输出数组编号为1空间中的值。
二、数组内存详解
1、Java内存的分配
Java内存分配:栈、堆、寄存器、常量池、静态域。
栈内存:
存储局部变量,只要在方法中定义的都是局部变量。一旦声明周期结束,变量就会销毁。
堆内存:
存储都是实体(对象)
,每一个实体都有一个首地址
,就是在内存中存储的位置。堆内存的变量都有初始化。
方法体中引用变量和基本变量都在栈上,其它都在堆中。
局部变量的引用型:会把对象存在堆中,而把引用存在栈中。
2、数组内存分配
int[] arr01 = new int[3]; //定义数组arr01 指向new 开辟的新数组地址
arr01 = null; //定义数组arr01 指向null
说明:
1.程序执行main()方法时,遇见 new int[3 ] 会在堆内存中开辟新空间,并给其分配一个地址(假设 0x34)。
2.数组各个空间都有默认的 编号 (角标/下标或索引
),将编号中对应的 数据 根据数据类型
完成 初始化。
3.数组创建成功,将数组的 地址 赋值给 arr ,让 arr 指向堆 中数组实体。
4.程序继续进行,将 arr 的指引赋值为 null ,即 arr 不再指向堆中数组实体。
5.这是堆中的数组会被标记成垃圾,等待垃圾回收站回收GC
释放堆中资源。
class Demo08{
public static void main(String[] args) {
int[] arr = new int[4]; // 1.定义数组数组编号称为角标 从0开始的
//2.数组赋值
arr[0] = 34; // 给第一个元素赋值
arr[1] = 18; // 给第二个元素赋值
arr[2] = 57; // 给第三个元素赋值
System.out.println("数组arr的第二个元素是:" + arr[1]);
System.out.println(arr); // 数组arr对应在堆中的地址信息。
char chas[] = new char[3];
System.out.println("chas[0]="+chas[0]); // 0
System.out.println(chas[0]==0); // 0对应的字符
boolean flag[] = new boolean[2];
System.out.println("flag[0]="+flag[0]); // false
String strs[] = new String[4];
System.out.println("str[0]="+strs[0]); //null
}
}
/*
数组arr的第二个元素是:18
[I@1540e19d
chas[0]=
true
flag[0]=false
str[0]=null
*/
3、数组常见问题
3.1、数组角标越界异常
class Demo10{
public static void main(String[] args) {
int arr[] = new int[3];
System.out.println(arr[3]);
}
}
// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
3.2、数组空指针异常
class Demo10{
public static void main(String[] args) {
int arr[] = new int[3];
//System.out.println(arr[3]);
arr = null;
System.out.println(arr[3]);
}
}
三、数组的应用
1、数组另一种定义格式
元素类型 数组名[] = new 元素类型[]{
元素1,元素2,......元素n};
元素类型 数组名[] = {
元素1,元素2,......元素n};
2、遍历数组
从角标0
开始,主键递增角标对应一位数组里的元素。
class Demo12{
public static void main(String[] args) {
int nums[] = {
12,5,873,144,26}; // 角标:0 1 2 3 4
for (int i = 0; i < 5; i++) {
System.out.println(nums[i]);
}
// Arrays.toString 快速打印数组内容 会打印 []
System.out.println(Arrays.toString(nums));
}
}
/*
12
5
873
144
26
[12, 5, 873, 144, 26]
*/
但是如果数组的内容异常庞大
,这时候就需要确定数组的大小
。
// 数组对象的length属性存储了数组长度的信息。
System.out.println("nums数组的大小为:"+nums.length);
nums = new int[]{
12,22,34,55,1,3,44,5,4444,388};
int arr_length = nums.length;
for (int i = 0; i < arr_length; i++) {
System.out.println(nums[i]);
}
3、数组求和
需求:求数组中所有元素的和
思路:
1.需要定义个功能,用来求数组中所有元素的和。
2.定义功能,必须搞清楚两个明确。
1):
有返回结果,即所求的和 ,和的类型为int
。
2):
有未知的参数参与。需要求和的数组 ,数组需要调用者传递给此功能。
步骤:
- 定义变量记录和。
- 通过循环对数组进行遍历。
class Demo13{
public static int getSum(int []nums){
int res = 0;
int length = nums.length; // 获取长度
for (int i = 0; i < length; i++) {
res += nums[i];
}
return res;
}
// 数据类型...形式参数 可变长度参数 就是数组
public static int getSum1(int...nums){
int res = 0;
int length = nums.length; // 获取长度
for (int i = 0; i < length; i++) {
res += nums[i];
}
return res;
}
public static void main(String[] args) {
int nums[] = {
23,45,12,76,3,5,8,77};
int sum = getSum(nums);
System.out.println("数组的求和结果:"+sum);
}
}
4、数组求最值
需求:获取多个整数中最大值
思路:
1.数据多了为了方便操作,先储存起来。需要容器,用数组。
2.多个数据需要进行比较。每次都有较大 的数,需要记录下来和下一个数比较。
3.将数组中的元素都比一边。最后,就获取到最大值。
步骤:
1.接收欲求最大值的数组
。
2.定义一个变量记录较大的数。
3.对数组进行遍历。让元素和较大的值进行比较。如果元素大于较大的数,用变量记录给元素。
4.遍历完成后,变量中记录就是最大值
。
class Demo13{
public static int getMax(int...nums){
int max = nums[0];
int length = nums.length;
for (int i = 1; i < length; i++) {
if (max < nums[i]){
max = nums[i];
}
}
return max;
}
// 根据角标进行
public static int getMax1(int []nums){
int max = 0;
int length = nums.length;
for (int i = 1; i < length; i++) {
if (nums[max] < nums[i]){
max = i;
}
}
return nums[max];
}
public static void main(String[] args) {
int nums[] = new int[]{
1,3,44,22,555,44,33