数组
- 什么是数组
- 数组的定义
- 数组的静态初始化
- 数组的地址值
- 数组元素访问
- 数组遍历
- 数组动态初始化
- Java内存分配
- 二维数组
什么是数组:
一种容器,存储同种数据类型的多个值
Java的数组是引用数据类型,数组元素的数据类型既可以是基本数据类型,也可以是引用数据类型
Jva的数组都是动态数组,在声明数组变量后,使用new运算符申请数组的存储空间
数组的定义
- 数据类型[]数组名(一般都写这种)
- 数据类型 数组名[]
如:int[]array;
这里有一点注意的,就是C语言中我们习惯[]放在数组名后,但是在java中更习惯[]放在数组名前
但若像C语言那样的写法,也行,但需注意两种写法的不同点
int x[],i=0; //i是int变量
int [] x,i; //i是int[]变量
数组的静态初始化
完整格式:
数据类型[]数组名=new 数据类型[]{ 元素1,元素2…}
如: int []array=new int[]{11,22,33};
简写:
数据类型[]数组名={元素1,元素2…};
如: int[]arr={11,22,33};
数组的地址值
数组名代表的就是数组的地址值
[D@6576fe71
其中
[表示是个数组,
D表示类型为double
@为间隔符号,无实际含义
6576fe71是真正的地址值
数组元素访问
数组名[索引],索引从0开始.也叫做下标,角标
- 存数据
- 获取数据
数组长度
Java 语言自动为每个数组变量提供 length 属性表示数组占用的存储单元个数。使用点运算符获得数组长度的语法格式如下:数组变量.length
例如:arr.length表示arr数组的长度
数组遍历
用循环遍历数组
int []arr={1,2,3,4,5};
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
自动的快速生成数组的遍历(idea提供的)
数组名.fori 会自动补全遍历
for语句作用于数组的逐元循环,也俗称增强for
Java自JDK5开始支持for语句作用于数组的逐元循环(for each loop),语法格式如下:for(类型 变量:数组)
其中,“类型”是“数组”的元素类型,“类型”的“变量”获得“数组”的每个元素。
故,循环遍历数组也可以写成
public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
for (int j : arr) {
System.out.println(j);
}
}
}
数组动态初始化
数据类型 [] 数组名=new 数据类型[数组长度];
如:int[]arr=new int [3];
这里有点注意:这里的3可以更换成任何一个变量,在C语言中,数组长度不支持变量,但是在java中允许
动态初始化时,虚拟机会给出默认的初始值
-
整数类型:0
-
小数类型:0.0
-
字符类型:‘/u0000’ 空格
-
布尔类型:false
-
引用数据类型:null
补充一个小知识点: System.out.print(count);不会换行
Java内存分配
- 栈 方法运行时使用的内存,比如main方法运行,进入方法栈中执行
- 堆 存储对象或者数组,new来创建的,都存储在堆内存
- 方法区 存储可以运行的class文件
- 本地方法栈 JVM在使用操作系统功能的时候使用,和我们开发无关
- 寄存器 给CPU使用过,和我们开发无关
二维数组
二维数组静态化格式
正规:数据类型[][] 数组名=new 数据类型[][]{{元素1,元素2,…},{元素1,元素2,…}}
简写::数据类型[][] 数组名={{元素1,元素2,…},{元素1,元素2,…}}
但是建议写成以下格式(每个一维数组写到一行)
如:
int[][] arr ={
{1,2,3},
{4,5,6,7,8}
};
获取元素
arr[x][y]
遍历
public class Main {
public static void main(String[] args) {
int[][]arr={
{1,2,3},
{4,5,6}
};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j< arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println("");
}
}
}
二维数组的动态初始化
格式:数据类型[][]数组名=new 数据类型[m][n];
例如:int [][]arr=new int[3][5];
不规则的二维数组
由于二维数组mat中每个一维数组mat[0]、mat[1]等是分散存储的,因此各一维数组mat[0]、mat[1]等占用存储空间容量可不相同,可分别申请。
例如:
int mat[][]=new int[3][];//申请第一维的存储空间
mat[0]= new int[3];//申请第二维的存储空间
mat[1]=new int[4];
习题:
1.反转整型数组,例如,数组中原来是{1,9,8,1,0,3,2,7},变成{7,2,3,0,1,8,9,1}
2.打乱整型数组,需用到Random类(在第四节课后习题里有例题)
3.叶奶奶书上的例题:幻方.可以只写出奇数阶幻方
n阶幻方(MagicSquare)是指将自然数1~n²排列成n * n阶方阵,其各行、各列及两条对角线上的数值之和相等
例如:
8 1 6
3 5 7
4 9 2
对于奇数阶幻方,有一种方法为连续摆数法(可参考上面这个3 * 3的奇数阶方法来理解下面的方法):
①约定初始位置是第0行中间,放置1。
②向当前位置的右上方顺序放置下一个数,如5、6;若下一个位置超出数组下标范围,则将幻方阵沿行、列方向看成环形,下标再从0开始计数,如2、3。
③若当前放置数是n的倍数,表示一条对角线已满,则下一个012S位置是本列下一行,如4、7。