Java数组(来自初学者)
一、数组的概念
数组(Array)是有序的元素序列。实际上数组是一组连续的存储空间,存储多个相同数据类型的值。它同一种类型数据的集合。
例如C++动态数组:
int *a=new int[5];
for(int i=0;i<5;++i)
{
cout<<"input a:";
cin>>a[i];
}
for(int i=0;i<5;++i)
{
cout<<a[i]<<" ";
}
delete[] a;
依次赋值为5,4,3,2,1运行结果:
5
,
4
,
3
,
2
,
1
5,4,3,2,1
5,4,3,2,1
此外还有静态数组:
int a[5];
int a[5][5]; //二维数组
二、数组的定义及初始化
通过类比C++动态数组的创建语法,我们可以得出Java数组的初始化方法。注意到Java没有指针,赋值符号左侧的语法与C++不同。
1、动态定义及初始化
int[] a= new int[5];
for(int i=0;i<a.length;++i)
{
a[i]=10+10*i;
System.out.println(a[i]);
}
运行结果:
10
,
20
,
30
,
40
,
50
10,20,30,40,50
10,20,30,40,50
其中我们可以知道a.length是求数组元素个数的函数。
也可以写作:
int a[]= new int[5];
或拆分成定义和初始化两步。
int []a;
a= new int[5];
2、静态定义及初始化
int a[];
a=new int[]{10,20,30,40,50};
for(int i=0;i<a.length;++i)
{
System.out.println(a[i]);
}
这是使用了拆分过后的数组静态定义的方法,不需要遍历所有变量可以手动赋值。
3、缩略写法
int[] a={10,20,30,40,50};
for(int i=0;i<a.length;++i)
{
System.out.println(a[i]);
}
这是数组静态定义的缩略形式。
需要注意的是,下列写法是错误的!
int a[];
a={10,20,30,40,50};
三、数组的常见异常
1、索引值越界异常
int[] a={10,20,30,40,50};
for(int i=0;i<=a.length;++i)
{
System.out.println(a[i]);
}
运行后提示一行报错信息:
E
x
c
e
p
t
i
o
n
i
n
t
h
r
e
a
d
"
m
a
i
n
"
j
a
v
a
.
l
a
n
g
.
A
r
r
a
y
I
n
d
e
x
O
u
t
O
f
B
o
u
n
d
s
E
x
c
e
p
t
i
o
n
:
5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
Exceptioninthread"main"java.lang.ArrayIndexOutOfBoundsException:5
这一情况是因为在数组只有五个元素,索引值范围0~4,输出数组元素时却调用了a[5]。这段代码发生了索引值越界异常这一错误。
2、空指针异常
int[] a={10,20,30,40,50};
a=null;
System.out.println(a[0]);
运行后提示一行报错信息:
E
x
c
e
p
t
i
o
n
i
n
t
h
r
e
a
d
"
m
a
i
n
"
j
a
v
a
.
l
a
n
g
.
N
u
l
l
P
o
i
n
t
e
r
E
x
c
e
p
t
i
o
n
Exception in thread "main" java.lang.NullPointerException
Exceptioninthread"main"java.lang.NullPointerException
这一情况是因为数组的内存地址丢失,无法访问。
四、数组的内存分析
数组使用的内存 | 储存 | 使用 | 释放内存空间 |
---|---|---|---|
栈(Stack) | 局部变量 | 方法(函数)的运行 | 变量出了作用域 |
堆(Heap) | 对象内存 | new创建的对象 | 垃圾回收器不定时回收 |
注:两个数组的开辟,分配的是两块不同的内存空间。
五、二维数组
1、创建二维数组
首先是直接分配行列的写法。
int a[][];
a= new int[5][5];
for(int i=0;i<a.length;++i)
{
for(int j=0;j<a[i].length;++j)
{
a[i][j]=10+10*j+50*i;
System.out.println(a[i][j]);
}
}
运行结果:
10
,
20
,
30
,
40
,
50
,
60
,
70
,
80
,
90
,
100
,
110
,
120
,
130
,
140
,
150
,
160
,
170
,
180
,
190
,
200
,
210
,
220
,
230
,
240
,
250
10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250
10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250
还能分两步分配行列,但是第一次必须分配行。
int [][]a;
a= new int[5][];
for(int i=0;i<a.length;++i)
{
a[i]=new int[5];
}
for(int i=0;i<a.length;++i)
{
for(int j=0;j<a[i].length;++j)
{
a[i][j]=10+10*j+50*i;
System.out.println(a[i][j]);
}
}
运行结果同上。
2、初始化二维数组
一般形式:
int a[][];
a=new int[][]{{10,20,30,40,50},{60,70,80,90,100}};
缩略形式:
int a[][]={{10,20,30,40,50},{60,70,80,90,100}};
动态分步形式:
int [][]a;
a= new int[5][];
for(int i=0;i<a.length;++i)
{
a[i]=new int[]{1,2,3,4,5};
}
3、多维数组
四维数组:
float b[][][][] = new float[5][][][];
六、不规则数组
int [][]a;
a= new int[4][];
a[0]=new int[]{11,12,13};
a[1]=new int[]{21,22,23,24};
a[2]=new int[]{31,32,33,34,35};
a[3]=new int[]{41,42,43,44,45,46};
for(int i=0;i<a.length;++i)
{
for(int tmp:a[i])
{
System.out.println(tmp);
}
}
运行结果:
11
,
12
,
13
,
21
,
22
,
23
,
24
,
31
,
32
,
33
,
34
,
35
,
41
,
42
,
43
,
44
,
45
,
46
,
11, 12, 13, 21, 22, 23, 24, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 46,
11,12,13,21,22,23,24,31,32,33,34,35,41,42,43,44,45,46,
可见应对不规则数组,可以使用for循环的一种特殊形式。
七、数组的基本操作
1、数组遍历
for(int i=0;i<a.length;++i)
{
for(int j=0;j<a[i].length;++j)
{
a[i][j]=10+10*j+50*i;
System.out.println(a[i][j]);
}
}
上方介绍二维数组时已经提到。
2、数组元素的填充和替换
import java.util.Arrays;
int a[];
a= new int[5];
Arrays.fill(a,8);
for(int i=0;i<a.length;++i)
{
System.out.println(a[i]);
}
运行结果:
8
,
8
,
8
,
8
,
8
8,8,8,8,8
8,8,8,8,8
参考资料:
1、https://github.com/datawhalechina/team-learning-program/blob/master/Java/4.数组.md
2、https://blog.csdn.net/nishiwodebocai21/article/details/96484891
2、CDSN与百度搜索