一、基本概念
1、维度
0维:一个点(单独一个数据)
1维:由无数个点构成的一条线(由多个单独数据构成一维数组)
2维:由无数条线构成的一个面(由多个一维数组构成二维数组)
3维:由无数的面构成的立方体(由多个二维数组构成三维数组)
4维:由无数个立方体构成的超立方体(由多个三维数组构成四维数组)
5维:由多个超立方体构成平行宇宙(由多个三四维数组构成五维数组)
总结:n维数组是由多个n-1维数据构成的(n>0)
2、数组是使用有序方式对数据进行存储的一种结构
二、名称及属性
(一)一维数组
索引/下标 | 0 | 1 | 2 | 3 | 4 |
内容 | a | b | c | d | e |
1、数组的索引/下标/角标:每个元素的门牌号(标识),从0开始
2、数组可以根据下标获取元素:
数组名[下标]
如:
array[0]
3、 数组的长度:数组元素的个数
数组名.length
是一个整数型
如:
array.length
(二)二维数组
1、数组的元素:一维数组
2、数组的长度:一维数组的个数(前面那个[]里的值)
//如:
int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}}
System.out.println(arr.length);
int[][] array = new int[5][3];
输入结果
3
5
3、访问二维数组里面某个一维数组 :
二维数组名[下标]
如:
int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}}
arr[0] 代表访问第一个数组{1,2,3}
4、访问二维数组里最底层的元素
二维数组名[下标1][下标2]
如:
int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}}
arr[0][1] 代表访问第一个数组{1,2,3}的第2个元素“2”。
三、数组特性
1、长度固定不可变
2、所有数据类型都有自己的对应的数组
3、同一个数组数据类型必须一致
四、创建数组
(一)静态创建/静态初始化
1、完整写法
一维数组:
数据类型[ ] 数组名 = new 数据类型[]{数据1,数据2,数据3...};
如:
int[] array = new int[]{1,2,3};
二维数组:
数据类型[ ][ ] 数组名 = new 数据类型[ ][ ]{{数据1-1,数据1-2,数据1-3},{数据2-1,数据2-2,数据2-3},{数据3-1,数据3-2,数据3-3}};
如:
int[][] array = new int[][]{{1,2,3},{4,5,6},{7,8,9}};
2、简便写法
一维数组:
数据类型[] 数据名 = {数据1,数据2,数据3...} (面向对象时不好用)
如:
int[]array = {1,2,3};
(二)动态创建/动态初始化
一维数组:
数据类型[ ] 数组名 = new 数据类型[长度];
如:
int[] array = new int[5];
//代表创建一个长度为5的整数型数组
二维数组:
数据类型[ ][ ] 数组名 = new 数据类型[一维数组的个数][每一个一维数组元素的个数];
如:
int[][] array = new int[a][b];
//代表创建一个a行b列的整数型二维数组
系统会给出默认值(出厂设置):
-整数类型:0
-浮点数类型:0.0
-字符串(引用数据类型):null
-char : 0 (空字符)
-布尔类型:false
#直接打印数组名
一维数组:
[I@15db9742
-@ 分隔符
-[I 这个数组是int类型的一维数组
-15db9742 是十六进制的内存地址
进制常识: 十进制,没有十, 0~9 10
二进制,没有二, 0 1 10
十六进制,没有十六,0~9 a b c d e f
二维数组:
[[I@15db9742
-多了一个[
#java内存结构
-寄存器 ——存取效率最高的区域,由CPU直接调度
-本地方法区 ——由本地操作系统调度
-方法区 ——存储java编译好的class文件内容
-堆 ——存储对象的实例(new出来的东西,等号的右边)
-栈 ——存活时间最短,存储基本类型的局部变量(定义在方法中的变量),以及对象的引用(等号的左边)
五、数组的遍历
(一)一维数组
1、概念:一个一个获取数组中的元素
2、方式一:根据下标获取(元素不多可以用)
3、方式二:使用循环遍历
int[] array = new int[] {1,2,3,4,5};
(int i =0 ;i<array.length;i++) {
System.out.print(array[i]+" ");
}
结果是:
1 2 3 4 5
会遇到的bug:
ArrayIndexOutOfBoundsException(数组越界)——下标超过了长度
(二)二维数组
注意:需要两层循环,外层循环负责遍历每个一维数组,内层循环负责遍历数组中每个元素
六、数组中思想
(一)累加的思想
在循环外面定义一个变量,
在循环过程中进行“累”的运算
放入数组中进行遍历运算。
int[] array = {321,123,585,6261};
int sum = 0;
for(int i=0;i<array.length;i++) {
sum+=array[i];
}
System.out.println("总数:"+sum);
(二)统计的思想
1、在循环遍历之外定义一个变量用于计数
2、在循环遍历过程中判断满足条件的情况下,计数器增加
//统计
int[] array1 = {321,76,32,7613,2,32,78,45};
int count = 0;
for(int i =0;i<array1.length;i++) {
if(array1[i]%2==0) {
count++;
}
}
System.out.println("偶数的总数:"+count);
(三)求最值的思想
1、在循环遍历之外定义一个变量作为参照物
2、在循环过程中,将参照物与每一个元素进行比对
3、如果元素比参照物大,将元素的值赋值给参照物
//求最值
int[] array2= {-321,-76,-32,-7613,-2,-32,-78,-45};
int max = array2[0];//一开始就赋值为数组中的某个元素
for(int i =0;i<array2.length;i++) {
if(array2[i]>=max) {
max=array2[i];
}
}
System.out.println("最大值:"+max);
(四)排序的思想
1、在循环遍历之外定义一个变量作为中间变量
2、在双重循环过程中,将两个下标的元素进行比对
3、如果元素有差,那么交换两个元素。
//排序
int[] array3=new int[] {7,5,3,2,9,8,4,1,6};
int x=array3[0];
for(int i=0;i<array3.length;i++) {
for(int j =i;j<array3.length;j++) {
if(array3[i]>=array3[j]) {
x=array3[i];
array3[i] =array3[j];
array3[j]=x;
}
}
}
System.out.println(Arrays.toString(array3));
七、数组的修改
(一)元素的修改
数组名[下标]=新的值
(二)地址的修改
int[] array = {1,2,3,4};
array = new int[3];
java有一个自动释放内存机制,没被指针指到的堆会自动释放。
int arr = {22,44,66};
array = arr ; //数据的浅拷贝(仅拷贝地址,本质上是同一个对象)
深拷贝:将某个数组中的每一个元素复刻给另一个数组(本质上是两个数组,互不影响)