1.格式
数据类型[]数组名 =new 数组类型[数组的长度];
数据类型有基本数据类型八个和引用数据类型
2.数组的定义:
用处:
存储同种数据类型多个元素的集合
简单写法:
int[] a = {,,,,,,};
3.数组的初始化:
动态初始化:给出数组长度,由系统给出默认数据初始值
写法: int[] a = new int[5];
静态初始化:给出初始化数据,由系统给出长度
写法:int a[] ={,,,,}写法二:int[] a = new int[];a=new int[]{,,,,};
写法二可以创建对象,在之后赋值,而写法一只能写在同一行
基本数据类型初始化值:
整型:0,字符型:\u0000,浮点型:0.0,布尔型:false
数组索引越界异常原因:访问了不存在的索引
空指针异常:数组已经不再指向堆内存
4.数组的遍历:
概念:依次输出数组中的每一个元素。学习数组时要牢记相关概念,专业术语,不然运用解说的时候不能表达清楚,思考也会模糊。
小知识:当两个数组共有同一个地址池时,改变一个数组元素,另一个也将随之改变。
5.数组的操作:获取最值,反转(元素对调),查表法(根据数组索引找到对应元素),基本查找(数组元素查找,查找指定元素第一次在数组中出现的索引)
获取最值:
int max = arr[0];
for(int i=1;i<array.lenth;i++){
if(max<arr[i]){
max=arr[i];
}
return max;
}
数组元素反转(就是元素对调):
for(int i=0;i<arr.length/2;i++){
// arr[0]和[arr.lenth-1]交换
// 1--lenth-1-12和lenth-1-1-1------
int temp = arr[i];
arr[i] = arr[arr.length-1-i];
arr[arr.lenth-1-i]=temp;
}
查表法(根据数组索引找到对应元素):
思路:键盘录入一个数,通过调用方法输出对应的星期,根据索引返回的星期为char值,参数week为int型:
import java.util.Scanner;
class Demo_5_4 {
//数组查表法:输出星期(数组)
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int week= sc.nextInt();
System.out.println(Weeks(week));//方法后加()而不是[ ]要看清,因为调用的是方法而不是数组。
}
public static char Weeks(int week){
char[] arr= {' ','一','二','三','四','五','六','日'};
return arr[week];
}
}
基本查找(数组元素查找,查找指定元素第一次在数组中出现的索引):
public static void getIndex(int[] arr,int value){
for(int i=0;i<arr.length;i++){
if(arr[i]==value){
return i;
}
}
return -1; //如果数组中的所有元素与查找的元素没有匹配的,返回-1
}
6.二维数组:
二维数组类似于一维数组,但一个一维数组包含多个元素,而二维数组是有多个一维数组,每个一维数组包含多个元素
格式:int[][] arr = new [4][12];----arr二维数组中,包含四个一维数组,每个一位数组有12个元素。从左往右,从上往下开始定义索引,从arr[0][0]开始计算。
二维数组遍历:
用嵌套for遍历,外for循环表示一维数组的个数(相当于二维数组长度),内for循环表示一维数组的(长度)
不同长度的数组怎么遍历:
如 int arr[][] ={{12,3,3,},{41,58}};
在嵌套for循环中,a[i][j] i代表数组长度,j代表一维数组的长度。可用a[i].length表示二维数组中一维数组的长度,即:在嵌套内循环的长度限定该为a[i].length.
length 意思为获取该属性的长度。
容易出错混淆点:方法调用时怎么确定是否定义变量
例子:
import java.util.Scanner;
//找最值
class Demo_5_3 {
public static void main(String[] args) {
int[] a = {14,45,15,21,64,87};
int s = getMax(a);
System.out.print(s);---需要先定义int型对象,通过对象来打印结果,
getMin(a); ---没有定义对象,直接调用方法,在方法中传入参数。
}
public static int getMax(int[] arr){-----返回值类型为int类型,有返回值,返回的是int型值,调用该方法时要定义int型对象。
int Max = arr[0];
for(int i=0;i<arr.length;i++){
if(Max<arr[i]){
Max = arr[i];
}
}
return Max;
}
public static void getMin(int[] arr){----返回值为void类型,没有返回值,调用该不需要创建对象。
int min = arr[0];
for(int i=0;i<arr.length;i++){
if(min<arr[i]){
min = arr[i];
}
}
System.out.print(min);
}
}
基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失
如:int a; change(a)输出a的值,之后再打印 a的值,a的值还是原值不变,虽然调用了change()方法,但调用完就会弹栈,a的值不会改变。
引用数据类型的值传递,因为原值,因为即使使用方法弹栈,但堆内存数组对象还在,可以通过地址继续访问
如:创建数组对象,通过方法改变值,虽然使用该方法并弹栈了,但数组对象还在堆内存中,改变的值还存在。
7.内存:
在内存中,有方法区,堆,栈;可以简单解释为,加载类 .classl进入方法区,成员变量、创建的对象定义在堆中,调用的方法在栈里,当调用的方法使用完成后,会进行弹栈,把相关数据当成垃圾清理。而在堆中的对象随对象的创建而创建,随对象的使用而存在,随对象的使用完毕而结束。只要有调用该对象,该对象就存在。
而局部变量在方法中,随方法的弹栈而消失。
问:Java中到底是传值还是传址
1.既是传值,也是传址,基本数据类型传递的值,引用数据类型传递的地址
2.Java中只有传值,因为地址值也是值(支持者是高司令(Java之父))