Java——数组
1.数组概述
数组是存储多个变量(元素)的东西(容器),这多个变量的数据类型要一致。数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。数组分为:一维数组和二维数组
2.一维数组
1.格式
格式1:数据类型[] 数组名;
格式2:数据类型 数组名[];
type var [ ] ; 或 type [ ] var ;
注意:这两种定义做完了,数组中是没有元素值的。所以必须初始化。
2.初始化概述
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。
初始化分类:动态初始化和静态初始化。
3.初始化方式
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。
1)动态初始化格式
2)静态初始化格式
3)在内存中的分配
一维数组初始化后在内存中的分配图:
3.二维数组
1.概述
其实二维数组其实就是一个元素为一维数组的数组。
2.格式
3.举例
int a[][] = newint [3][];
a[0] = new int [2];
a[1] = new int [4];
a[2] = new int [3];
图解如下:
以二维数组为例,其实二维数组就相当于数组中包含数组,所以在声明的时候要先声明第一维度,如下:
a[0] = new int [2]; 相当于给第一个包含在内的数组声明了两个小格的内存,
a[1] = new int [4]; 相当于给第二个包含在内的数组声明了四个小格的内存,
a[2] = new int [3]; 相当于给第三个包含在内的数组声明了三个小格的内存,
理解了二维数组的概念应该就能理解多维的概念
4.二维数组的初识化
-
- 静态初始化: int intA[][] = {{1,2},{3,4},{7,8,9}};
- 动态初始化:
-
int a[][] = new int [3] [5]; int b[][] = new int [3][]; b[0] = new int [2]; b[1] = new int [3]; b[2] = new int [5];
5.二维数组举例
4.数组的拷贝
使用java.lang.System类的静态方法:
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int lenth)
- 可以同于数组src从第srcPos项元素开始的lenth个元素拷贝到目标数组从destPos项开始的length个位置
- 如果源数据数目超过目标数组边界会抛出IndexOutOfBpundsException异常
- 需要注意的是,修改拷贝后的数组,源数组的值也会跟着改变,因为copy后的数组和源数组在内存空间指向的是同一地址,可以参考后面的例子来理解这句话
publicclass Test {
public static void main(String[] args){ //一维数组的拷贝 String[] s = {"Mircosoft","IBM","Sun","Oracle","Apple"}; String[] sBak = new String[6]; System.arraycopy(s, 0, sBak, 0, s.length); for(int i=0;i<sBak.length;i++){ System.out.print(sBak[i]+" "); } System.out.println(); for(int i=0;i<s.length;i++){ System.out.print(s[i]+" "); } System.out.println(); //二维数组的拷贝 int [][] intArray = {{1,2},{1,2,3},{3,4}}; int [][] intArrayBak = new int[3][]; System.arraycopy(intArray, 0, intArrayBak, 0, intArray.length); intArrayBak[2][1] = 100; for(int i = 0;i<intArray.length;i++) { for(int j=0;j<intArray[i].length;j++) { System.out.print(intArray[i][j]+" "); } System.out.println(); } } }
再看一个例子:
public
class
Test {
public
static
void
main(String[] args) {
int
a[] = {
1
,
2
,
3
,
4
};
int
b[] = {
4
,
2
,
3
,
5
,
6
};
int
c[];
int
c1[];
//相当于数组扩充,观察c1和c2的输出来参考这个函数的使用方式
c = Arrays.copyOf(b, a.length + b.length);
c1 = Arrays.copyOf(a, a.length + b.length);
System.out.println(
"c = "
+ Arrays.toString(c));
System.out.println(
"c1 = "
+ Arrays.toString(c1));
//数组拷贝
System.arraycopy(b,
0
, c, a.length, b.length);
System.out.println(
"c = "
+ Arrays.toString(c));
System.out.println(
"a = "
+ Arrays.toString(a));
System.out.println(
"b = "
+ Arrays.toString(b));
}
}
5.练习
class PaiXu{
public static void main(String[] args) {
int[][] ar = {{23,21,12,14,56,67,2,6},{12,23,22,1,4},{3,4,44,33,55}};
reverce(ar);
printArry(ar);
//质因数(完数)
for (int i = 1; i <= 10000; i++) {
int sum = 0;
for (int j = 1; j < i/2+1; j++) {
if (i%j==0) {
sum += j;
if (sum==i) {
System.out.print(i+" ");
}
}
}
}
}
private static void reverce(int[][] ar) {
// TODO Auto-generated method stub
//升序
for (int i = 0; i < ar.length; i++) {
for (int j = 0; j < ar[i].length; j++) {
for (int j2 = 0; j2 < ar[i].length; j2++) {
if (ar[i][j]<ar[i][j2]) {
int temp = ar[i][j];
ar[i][j] = ar[i][j2];
ar[i][j2] = temp;
}
}
}
}
//printArry(ar);
}
private static void printArry(int[][] ar) {
// TODO Auto-generated method stub
for (int k = 0; k < ar.length; k++) {
for (int k2 = 0; k2 < ar[k].length; k2++) {
System.out.print(ar[k][k2]+" ");
}
System.out.println();
}
}
}
//输出结果
2 6 12 14 21 23 56 67
1 4 12 22 23
3 4 33 44 55
6 24 28 496 2016 8128 8190==》完数的输出结果
例如:
int a[] [] = { {1,2}, {3,4,5,6}, {7,9}};