Java基础知识总结(三):数组
程序员文章站
2024-03-15 12:44:41
...
1.数组概念
1.1 数组:一种容器,同时存放多个数据值
1.2 数组的特点
- 数组是一种引用数据类型
- 数组中的数据类型必须统一
- 数组的长度在程序运行期间不可改变
2.数组初始化
2.1 数组初始化:在内存创建一个数组,向其中赋予一些默认值
2.2 初始化分类:
- 动态初始化:(指定长度)
- 数组格式:
数据类型[] 数组名称=new 数据类型[数组长度];
-
解析含义:
左侧数据类型:数组当中保存的数据,全都是统一的类型
左侧中括号:代表数组
左侧数组名称:对数组取名称
右侧new:创建数组的动作
右侧数据类型与左侧数据类型保持一致
右侧中括号的长度,数组的长度为int类型. - 本质:创建数组,指定数组中的数据元素个数
- 静态初始化:(指定内容)
-
数组格式
静态初始化的数组长度是可知的
数据类型[] 数组名称=new 数据类型[]{元素1,元素2,...};
- 省略的格式
数据类型[] 数组名称 = {元素1,元素2,...};
- 本质:创建数组,不指定数据个数多少,直接将具体数据内容进行指定.
- 注意事项
- 静态初始化无指定长度,仍然会自动推算长度
- 静态初始化标准格式扩拆分两步
- 动态初始化格式也可以拆分两步
- 静态初始化一旦使用省略格式,不能拆分步骤
//省略格式静态初始化
int[] arrayA = {10,20,30};
//静态初始化标准格式,可拆分
int[] arrayB;
arrayB = new int[]{11,12,13};
//动态初始化可拆分
int[] arrayC;
arrayC = new int[7];
//静态初始化省略格式不可拆分
int[] arrayD;
xx:arrayD = {1,2,3,4};//错误
3.访问数组
3.1 获取数组元素
-
直接打印数组名称
-
得到数组对应的内存地址的哈希值
-
数组创建在内存,位置信息称为内存地址
public class ArrayUse {
public static void main(String[] args) {
int[] array = {10,20,30};
System.out.println(array);
}
}
//内存地址值,[代表数组值,I为int类型,@后代表十六进制内存地址值
[I@4554617c
- 访问数组元素格式
- 索引值是int数字,代表数组元素编号,从0开始,一直到数组长度-1;
数组名称 [索引值];
3.2 赋值
- 动态初始化数组, 元素自动拥有一个默认值
- 整数类型默认值为0
- 浮点类型默认值为0.0;
- 字符类型默认值为’\u0000’;
- 布尔类型默认值为false;
- 引用类型默认值为null.
- 静态初始化数组,系统自动将默认值替换为大括号的数值
4.java虚拟机内存划分
4.1 内存划分
4.2 数组内存图
- 一个数组内存图
- 两个数组内存图
-
两个引用指向一个数组内存图
5.常见问题
- 数组索引越界异常
- 数组元素编号从0开始,一直到数组长度-1为止.
- 访问数组元素编号不能超出边界
- 报错–>数组索引越界异常ArrayIndexOutOfBoundsException:
- 修改为存在的正确索引编号
- 空指针异常
- 所有的引用类型(包括数组)可以赋值为null,代表空
- 只赋值null,没有进行new创建,会发生空指针异常NullPointerException
- new数组,就可以解决
6.数组操作
- 获取数组长度
- 基本格式:
- 得到一个int数字,代表数组长度
- 数组一旦创建.长度不能改变
数组名称.length;
数组长度运行期间不可改变
- new数组变化的是创建新的数组,旧数组依然是原来的数组,不改变原来数组的长度
- 数组遍历输出
- 将数组的所有元素打印输出
- 方法一:原始
System.out.println(array[0]);
...
System.out.println(array[n-1]);
- 方法二:精简型
int n=array.length;
for(int i=0;i<n;i++){
System.out.println(array[i]);
}
- 求出数组的最值
- 最大值初始化为数组第一个值
int max=array[0];
for(int i=1;i < array.length;i++){
if(array[i]>max){
max=array[i];
}
}
System.out.println("max:"+max);
- 数组元素反转
- 前提是不创建一个新的数组>>>
...
public static void main(String[] args) {
int[] array = {10,20,30,40};
for(int i=0;i<array.length;i++){
System.out.println(array[i]);
}
System.out.println("==========BBB==========");
for (int min = 0, max = array.length - 1; min < max; min++, max--) {
int temp = array[min];
array[min] = array[max];
array[max] = temp;
}
// 再次打印遍历输出数组后来的样子
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
...
7.数组与方法
-
数组作为方法参数
-
当调用方法的时候,向方法的小括号进行传参,传递进去的其实是数组的地址值。
-
三要素:
-
返回值类型:只是进行打印而已,不需要进行计算,也没有结果,用void
-
方法名称:printArray
-
参数列表:必须给我数组,我才能打印其中的元素。int[] array
public static void printArray(int[] array) {
System.out.println("printArray方法收到的参数是:");
System.out.println(array); // 地址值
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
int[] array = { 10, 20, 30, 40, 50 };
printArray(array); // 传递进去的就是array当中保存的地址值
- 数组作为方法返回值
- 任何数据类型都能作为方法的参数类型,或者返回值类型。
- 数组作为方法的参数,传递进去的其实是数组的地址值。
-
数组作为方法的返回值,返回的其实也是数组的地址值。
public static int[] calculate(int a, int b, int c) {
int sum = a + b + c; // 总和
int avg = sum / 3; // 平均数
// 两个结果都希望进行返回
// 需要一个数组,也就是一个塑料兜,数组可以保存多个结果
/*
int[] array = new int[2];
array[0] = sum; // 总和
array[1] = avg; // 平均数
*/
int[] array = { sum, avg };
System.out.println("calculate方法内部数组是:");
System.out.println(array); // 地址值
return array;
}
上一篇: Spark架构原理-Checkpoint原理剖析和源码分析
下一篇: JAVA基础(数组静态初始化)