数组的定义以及初始化
1.数组可以存储基本数据类型和引用数据类型。但是所有元素必须是一个类型。
2.格式 :
- 1) 数据类型 [ ] 数组名; // 定义了一个int类型的数组a
- 2) 数据类型 数组名 [ ]; //定义了一个int类型的a数组
3.数组的初始化
- 1) 动态初始化:只指定长度,有系统初始化值
- 2) 静态初始化:给出初始化值,由系统决定长度
4.动态初始化
- 数据类型 [ ] 数组名 = new 数据类型 [ 数组长度 ] ;
- int [ ] arr = new int [3];
- 数组长度就是数组中元素的个数(或者容器的大小)
5.Java中的内存分配:
- 1) 栈内存
- 栈内存中存储的都是局部变量
- 局部变量:定义在方法声明上或者方法中的变量
- 2) 堆内存
- 每一个new出来的东西都是存储在堆内存中。
- 堆内存特点:
- a. 会为每一个new出来的东西分配一个内存地址值
- b. 堆内存中的元素会有一个默认的初始化值
- 基本数据类型:
- byte short int long — 0
- float double — 0.0
- char ——– ‘\u0000’
- boolean ——– false
- 引用数据类型 ——– null
- c. 使用完毕后,会变成垃圾,等待垃圾回收器回收垃圾(垃圾回收机制是一套算法,每过一段时间去检测垃圾,有垃圾则回收,垃圾回收实际上就是释放变量占的内存)。
- 3) 方法区
- 4) 本地方法区(系统相关使用)
- 5) 寄存器(CPU)
6. 数组的初始化不能动静结合
int[] arr = new int[]{1,2,3}; //静态初始化
int[] arr = {1,2,3}; //静态初始化
int[] arr = new int[3]{1,2,3}; // X ,不可取
7.数组中的两个小问题:
- 1)
java.lang.ArrayIndexOutOfBoundsException
原因:数组角标越线,角标不能小于0且最大索引是数组长度-1 - 2)
java.lang.NullPointerException
原因:访问了null的属性分或者方法。如果数组初始化为null,该变量就不指向堆内存中的任何地址。
数组中的常见操作
1.数组的遍历
- 1)普通的输出
for( int i = 0 ; i < arr.length-1 ; i++){
System.out.println(arr[i]);
}
- 2)带格式的输出
System.out.println("[");
for( int i = 0 ; i < arr.length ; i++){
if(i == arr.length - 1){
System.out.println(arr[i] + "]");
}else{
System.out.println(arr[i]+", ");
}
}
2.获取数组的最值
//定义一个数组
int[] arr = { 10000, 9527 , 10086 , 95535 , 10001,12306}
//定义一个参照物,假设这个参照物就是最大值
int max = arr[0];
for( int i = 0; i< arr.lrngth ; i++){
//获取一个元素,跟参照物进行比较
if ( arr[i] > max ){
//现在最大值是我们遍历到的这个数,需要将参照物设置成当前的这个数
max = arr[i];
}
}
3.数组元素的反转
//打印反转之前的数组
int[] arr = {1,2,3,4,5,6,7,8,9};
//定义2个索引
int startIndex = 0;
int endIndex = arr.length - 1;
for(int i = 0; i<arr.length; i++){
if(startIndex >= endIndex) {
break;
}
//交换两个索引对应元素的值
int temp =arr[startIndex];
arr[startIndex] = arr[temp];
arr[endIndex] = temp;
startIndex++;
endIndex--;
}
//遍历数组的方法
4.数组的查表法
- 需求:根据键盘录入索引,查找对应星期
//定义一个数组,存储的是星期的数据
String[] arr = {"","星期一","星期二","星期三",
"星期四","星期五","星期六",
"星期日",
}
Scanner sc = new Scanner(System.in);
int index = sc.nextInt() - 1;
//对用户输入的数据进行校验
if( index <= 1 || index > arr.length - 1){
System.out.println("请输入一个1-7的整数!");
}else{
System.out.println(arr.[index]);
}
5.基本查找(查找指定元素第一次在数组出现的索引)
- 定义一个方法获取指定元素第一次在数组中出现的索引
- 1.返回值类型 int
- 2.参数列表 int[] arr,int data
- int[] arr表示要查找的数组
- int data 表示的是需要查找的那个元素
//定义一个数组
int[] arr = {12,23,67,90,88}
//【法一】
public static int getIndex(int[] arr){
//遍历数组,和data进行判断
for(int i = 0; i<arr.length;i++){
if(arr[i]==data)
return i;
}
//如果程序走到这说明没有找到这个数,返回负数说明没找到
return -1;
}
【二维数组】
- 1.格式:
- a.数据类型 数组名[][] =new 数据类型[m][n];
- b.数据类型[] 数组名[] =new 数据类型[m][n];
- *b不推荐使用
- 2.定义二位数组,输出二维数组的名称,输出每一个一维数组的名称,输出二维数组的两个元素
//定义一个二维数组
int[][] arr =new int[2][2];
//打印二维数组的名称
System.out.println(arr);
- 3.二维数组的内存图解 (见doc)
- 4.二位数组格式2
- 1) 数据类型[][] 变量名 = new 数据类型[m][];
- 2) m表示二维数组中有多少个一维数组,但是现在一维数组还没有 定义
- 3)Demo定义一个二维数组,输出为二维数组的名称和二维数组的每一个一维数组;然后动态给二维数组赋值一维数组,再次输出二维数组中的每一个一维数组,给二位数组的中的元素赋值,输出对应的元素值。
int[][] arr = new int[2][];
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
//动态的给一维数组赋值
arr[0] = new int[3];
arr[1] = new int[2];
System.out.println(arr[0]);
System.out.println(arr[1]);
//给每一个一维数组赋值
arr[0][0] = 63;
arr[0][1] = 56;
System.out.println(arr[0][0]);
System.out.println(arr[1][1]);
//以上代码原理图见docx和笔记
- 5.二维数组格式3
见doc
- 1)Demo
/*
定义一个二维数组,需要对二维数组进行初始化
打印一个二维数组中的一维数组,再打印每一个二维数组中的元素
*/
int[][] arr = {{1,2,3},{4,5},{6}};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[0][2]);//3
System.out.println(arr[1][1]);//5
System.out.println(arr[2][0]);//6
//以上内存图见docx
- 6.遍历二维数组
//定义一个二维数组
int[][] arr = {{1,2,3},{4,5},{6}};
//遍历
for(int x = 0;x<arr.length;x++){
for(int i = 0;i<arr[x].length;i++){
System.out.println(arr[x][i]);
}
}
//优化见源码
练习
- 1.需求:公司年销售额求和
某公司按照季度和月份统计的数据如下:单位:万元
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
//定义一个二维数组用来存储每一个季度的销售信息
int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}
//计算二维数组中所有元素的总和
见源码
- 2.结论:
基本数据类型作为参数传递的时候,形参的改变不影响实际参数。
引用数据类型作为参数传递的时候,形参的改变对实际参数有影响。