一,数组的概念
数组是一种数据结构,用来存储同一类型值得集合,即批量存储数据的容器,数据的集合体
数组是一种引用型变量
二,数组的声明 与 初始化
声明 类型 [ ] 标识符;
声明 + 初始化 :
a 静态初始化
类型 [ ] 标识符 = { 数据1, 数据2, 数据3,数据4,,,}; //方便在初始化处不断为数组增加值
eg int [ ] A ={1, 2, 3, 4};
b. 动态初始化
类型 [ ] 标识符 = new 类型 [ 大小 ] ;
eg int[ ] A = new int [5];
c . 数组初始化默认值 int -- 0 float/double -- 0.0 boolean -- false char -- '\0' 引用类型 String/Person -- null
null != ”“; null 不等于空串 如果希望数组包含空串则需要赋空串值
匿名数组
new 类型 [ ] {数据1, 数据2, 数据3}
运行会容易出现问题,不建议使用
注意:1.一旦创建了数组,就不能改变它的长度,如果程序运行中需要经常扩展数组的大小,则应该使用 array list 数据结构
2.java中长度0数组与null数组 ,长度为0的数组与null数组并不相同
a. new elementType[0]
b. new elementType[ ] { }
3.静态初始化与动态初始化只能单独使用,即一个数组不可能被初始化两次
int[] boy = new int [4];
为数组分配元素后,数组 boy 获得4个用来存放int类型数据的变量,即四个int类型元素
数组变量 boy 中存放着这些元素的首地址,该地址称为数组的引用,数组通过new在堆区建立逻辑上的数组空间
三 , 访问数组元素
1.for 循环
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
2.for each 循环
依次处理数组(或其他元素集合)中的每一个元素,不必考虑指定下标值
for (variable : collection) statement
collection 集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象
打印数组a的每一个元素,一个元素一行,依次循环打印
for (int element : a)
System.out.println(element);
3.区别
a. for each 循环语句更加简洁,更不容易出错,不必在意下标开始与结束
b. for each 无法通过循环变量更改数组内容,无法定位数组位置
import java.util.Arrays;
public class Test {
public static void main (String [] args){
int[] B = new int [5];
B[0] = 1;
B[4] = 2;
System.out.println("for");
for(int i=0; i < B.length; i++)
System.out.println(B[i]);
System.out.println("for each ");
for (int b : B)
System.out.println(b);
System.out.println("Arrays.toString ");
System.out.println(Arrays.toString(B));
}
}
四,数组拷贝
a. 在Java中,允许将一个数组变量拷贝到另一个数组变量,这时,两个变量将引用同一个数组:
int[] A = B;
A[5] = 12; //now B[5] is also 12
数组A 与 B 引用的是同一个数组 ,即指向的地址相同
b. 拷贝到新的数组 B.length 定义新的数组长度
import java.util.Arrays; 这是Array的包名
int [] A = Arrays.copyOf (B, B.length);
c.这个方法常用来增加数组长度 增加的长度部分按照默认值对应元素
A = Arrays.copyOf (A, 2*A.length);
五 . 多维数组
1.定义
类型 [] [] 标识符 = { { },{ } };
类型 [] [] 标识符 = new 类型 [大小] [大小];
A ={{ }, { } ,{ }, { } ,{ } }; 的内存位置
注意 :for each 不能自动处理二维数组每一个元素 ,但是会循环处理一位数组
for (int [] A : a)
for (int value : A)
do something with value
快速访问方法
System.out.println(Arrays.tdeeptoString(A));
六, 不规则数组
多维数组的另一种理解方式:多维数组 = 数组的数组 二级数组为一级数组的元素内容,即一级数组的类型是多个元素
构造不规则数组
不同于C++ Java数组分配的是指针的数组 ,指针数组每个元素被填充了一个包含多个数字的数组
int [][] odds = new int [NMAX +1] [];
for(int n = 0; n <= NMAX; n++)
odds[n] = new int[n+1]; //创建一级数组大小
for(int n = 0; n <= odds.length; n++)
for(inr k = 0; k < odds[n].length; k++)
{
//compute lotteryOdds
int lotteryOdds = 1;
odds[n][k] = lotteryOdds;
}
public class Test2 {
public static void main (String [] args){
final int NMAX = 10;
int [][] odds = new int [NMAX +1] [];
for(int n = 0; n <= NMAX; n++)
odds[n] = new int[n + 1];
for(int n = 0; n < odds.length; n++)
for(int k = 0; k < odds[n].length; k++)
{
int lotteryOdds = 1;
for (int i = 1; i <= k; i++)
lotteryOdds = lotteryOdds * (n - i + 1) / i;
odds[n][k] = lotteryOdds;
}
for(int[] row : odds)
{
for(int odd : row)
System.out.printf("%4d",odd);
System.out.println();
}
}
}