一、定义数组:
int[ ] arrayName;
二、初始化数组:
数组必须初始化,分为两种初始化方法:
(1)静态初始化:不指定长度,只指定元素
格式:数组名 = new 类型[ ] {元素1,元素2,。。。}
// 数组引用变量(栈) 数组对象(堆)
int[] prices = new int[] {1,2,3,4,5};//静态初始化
int[]是一种数据类型,可用于定义变量,创建int[]类型对象也是创建数组。
简化语法(不好):只能在定义数组变量并指定初始值时使用
int a = {1,2,3,4};
(2)动态初始化::只指定长度,不指定元素
eg:
int[] prices = new int[5];//动态初始化,只指定长度,不赋值,默认0(类型不能为var)
也可以使用var来定义:
var prices = new int[5]; //这样更简洁
(3)创建数组对象(数组初始化)
定义局部变量时,可以使用var来定义,但是要指定初始值。
var names = new String[] {"xiaoming" , "dingding"};
(4)数组遍历:
for(var i=0;i<prices.length;i++)
{
System.out.println(prices [i]);
}
(5)使用foreach循环遍历数组
for(元素类型 变量名 :数组名)
{
//通过变量名访问每个元素
}
eg:
public class 使用数组
{
public static void main(String[] args)
{
int[] iArr = new int[]{1,2,3,4};//静态初始化
int[] Arr = new int[5];//动态初始化
for(var it : iArr)
{
System.out.println(it);
}
for(var it : Arr) //for循环的变量名 it 只在循环内有效
{
System.out.println(it);
}
}
}
foreach只能访问数组元素,不能修改数组元素(不要在循环中修改数组元素的值!)
(6)数组在内存中的运行机制
public static void main(String[] args)
{
int a=10; //基本类型,放在栈内存中,因为是在main方法中定义的
}
int[ ] p={1,2,3,4};
——p为数组引用变量,存储在栈内存 中,数组引用变量只是一个引用(地址,指针)。
——{1,2,3,4}为实际的数组对象,存储在堆内存 中。要通过前者来访问后者!
再比如:
int[ ] arr = new int[ ] {20};
arr是引用变量,在方法中定义的,存放在栈内存中; new处理的数组存放在堆内存中,即20在堆内存中,长度为1。
如果先定义数组变量:int[ ] a;则是先在栈内存中开辟一个空的引用(指针),因而没有指向任何有效内存;此时再指定数组长度:a=new int[4];即初始化后,数组对象被分配了内存,默认为0;
(7)引用类型数组初始化
上面是基本类型数组的初始化过程,数组元素为具体的值。如果数组元素还是引用,它还要指向另一块内存。
class Person//定义一个类
{
public int age;//对象
public double height;
public void information()//定义了一个方法,类似于函数
{
System.out.println("我的年龄是:"+age+" 我的身高是:"+height);
}
}
public class ArrayTest
{
public static void main(String[] args)
{
Person[ ] students=new Person[2];//定义了引用变量students,类型为Person[],并初始化
var zhang=new Person();//创建Person类实例并赋给zhang变量(相当于让zhang可以引用person类)
zhang.age=15;
zhang.height=158;
var lee=new Person();
lee.age=16;
lee.height=161;
//此时分配了4块内存,栈内存中存储两个引用变量,堆内存中存储两个Person实例
students[0]=zhang;
students[1]=lee;
lee.information();
students[1].information();
zhang.information();
}
}
【练习】
(1)一维数组基本操作
import java.util.*;
public class 练习题1_1
{
public static void main(String[] args)
{
int[] iArr =new int[4];//指的是个数,从1开始
int[] Arr = new int[]{1,3,5,7};
iArr[0]=5;
System.out.print("数组iArr元素为:");
for(var it:iArr)
{
System.out.print(it+"、");
}
System.out.print("\n"+"数组Arr元素为:");
for(var it:Arr)
{
System.out.print(it+"、");
}
}
}
(2)二维数组基本操作
import java.util.*;
public class 练习题1_1
{
public static void main(String[] args)
{
int[][] iArr = new int[4][4];//4行4列的动态二维数组
int[][] Arr = new int[][]{{1,2,1},{2,3,4},{4,9,7},{-1,-4,9}};//
iArr[0][0]=7;
iArr[1][1]=8;
System.out.println("数组iArr的元素为:");
for(int it[]:iArr) //foreach遍历数组
{
System.out.println(Arrays.toString(it));
}
System.out.println("\n"+ "数组Arr的元素为:");
for(int it[]:Arr)
{
System.out.println(Arrays.toString(it));
//Arrays类中的toString函数可输出数组内容,it为地址
}
}
}
注意:二维数组的foreach遍历与一维数组不同,一维数组是:
for(var it : iArr)
二维数组不能用var,for(int it[] : iArr),要用Arrays类中的toString函数