一、理解
1. 数组:
一次性定义多个相同类型的变量,可以存储多个数据,并且可以对多个变量进行统一
2. 数组的重要因素:
数据类型、数组的长度
3. 数组的使用:
(1)
声明数组:确定数据类型
数据类型
[]
数组名
; //
建议
数据类型 数组名
[];
数据类型
[]
数组名
;
int[] a;
(2)
分配空间:确定数组的长度
数组名
= new
数据类型
[
长度
];
a = new int[5];
4. 数组细节:
(1)
数组的下标:从
0
开始,依次为
0
、
1
、
2...
数组的长度-1
(2)
数组的访问:数组名
+
下标,数组名
[
下标
]
(3)
当访问数组时,给定的下标不合理,编译通过,运行报错,错误信息为:
java.lang.ArrayIndexOutOfBoundsExcepton(数组的下标越界
)
(4)
数组中元素进行一一访问,数组的遍历
for(int i=0;i<
数组的长度
;i++){
//
通过 数组名
[i]
访问数组元素
}
(5)
获取数组的长度:数组名
.length
5. 数组的默认值:
整数类型:
0
小数类型:
0.0
布尔类型:
false
字符类型:空字符
引用类型:
null
6. 数组定义:
(1)
先声明,再分配 空间
数据类型
[]
数组名
;
数组名
= new
数据类型
[
长度
];
(2)
声明的同时分配空间:
数据类型
[]
数组名
= new
数据类型
[
长度];
(3)
显示初始化:
数据类型
[]
数组名
= new
数据类型
[]{
数据1,
数据
2};
注意:数组的长度由
{}
中数据的个数决定
(4)
显示初始化:
数据类型
[]
数组名
= {
数据
1
,数据
2,
数据3};
注意:数组的声明和初始化一起完成
二、数组的内存
1.
数组在内存的空间连续的
2.
数组类型的变量粗出的是数组在内存空间的首地址
3.
寻址方式:首地址
+
下标
*
数据类型的字节数
三、数组的扩容
1. 思想:
(1)
创建一个长度更大的新数组,通常为原数组的两倍
(2)
将原数组中内容一一赋值到新的数组中
(3)
新地址覆盖旧地址
2. 数组扩容的实现:
(1)
第一种方式:
int[] a = new int[]{1,8,4}; //
长度为
3
for(int
i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
//
存储 一个新的数据
5
//
数组长度不够用,需要扩
容
// 1.
定义一个更大长度的
数组
int[] b = new
int[a.length*2];
// 2.
将旧数组中内容,赋
值到新数组中
for(int
i=0;i<a.length;i++){
//
新
=
旧
b[i] = a[i];
}
//
3. 新地址覆盖旧地址
a = b;
System.out.println("
扩
容之后的结果:
");
for(int
i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
(2)
第二种方式:借助工具类实现扩容
a=java.util.Arrays.copyOf(
原数组名
,
新数组的长度);
四、二维数组 【开发不常用+算法应用-比赛重点+考试-不设为重点】
1.
理解:
一维数组的一维数组,有行和列
2.
访问二维数组,通过行标和列标进行访问:数组名[
行标
][
列标
]
(行标也称为高维,列标也 成:低维)
3.
二维数组的遍历:
//
通过外层循环控制行
for(int i=0;i<
数组名
.length;i++){
//
通过内层循环控制列
for(int j=0;j<
数组名
[i].length;j++)
{
//
通过
a[i][j]
访问对应的数据
}
}
五、数组的排序
1.
排序:将数组中元素按照一定的顺序进行存储
2.
排序的方式:从小到大
(1)
冒泡排序:每次将相邻的两个元素进行比较,
将较大的元素逐步往后放
//
外层循环:控制比较的轮数
for(int i=1;i<a.length;i++){
//
内层循环控制每轮具体比较的内容
for(int j=0;j<a.length-i;j++){
//
使用
a[j]
和
a[j+1]
进行比较
-
》相邻
if(a[j]>a[j+1]){
//
交换
int temp =
a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
(2)
第二种方式:借助工具类
java.util.Arrays.sort(
数组名
);