数组基础
-
数组要求数组元素具有相同数据类型
-
Java是面向对象语言,存在继承,因此一个数组可能存在多种数据类型,如一个Fruit数组可能存有banana和apple.
-
可存储基本数据类型,也可存储引用数据类型
-
数组也是一种基本数据类型,本身是一种引用类型
-
定义数组时不能指定数组的长度,定义一个变量时,仅表示一个引用变量(指针),未指向任何有效内存。因此数组不能使用,需初始化后才能使用。
-
java数组的两种定义方式:
type[] arrayName;//推荐使用,
//即type[]是一种数据类型,与type完全不同,arrayName只是一个变量名,可读性好
type arrayName[];
- 数组初始化:分配空间,每个数组元素赋初值
a.静态初始化:指定数组各元素初值,系统决定数组长度
b.动态初始化:指定数组长度,系统分配个元素初值
例:
int[] intArr;
intArr=new int[]{5,6,7,8};//静态初始化
int [] intArr;
intArr=new int[4];//动态初始化
c.不可同时使用静态初始化和动态初始化
- foreach循环
语法格式:
for(type varibleName:array|collection){
//使用varibleName自动迭代访问每个元素
}
//访问数组无需获取数组的长度
注意:在使用Foreach语句时不可改变数组元素的值否则会造成错误
例:
1public static void main(String[] args) {
2 int []intArr=new int[]{1,2,3,4,5};
3 for(int a:intArr) {
4 System.out.println(a);
5 }
6}
11
22
33
44
55
深入理解数组
数组是一种引用数据类型,数组元素和数组变量在计算机中是分开存放的。 如下图
例子:
1public static void main(String[] args) {
2 // TODO Auto-generated method stub
3 int []a={1,2,3};
4 int []b=new int[4];
5 System.out.println("aLength="+a.length);
6 a=b;
7 System.out.println("aLength="+a.length);
8}
1aLength=3
2aLength=4
在执行a=b语句前,内存分布如下图
执行后,相当于指针a指向了b指向的地址,存储示意图如下
引用类型数组
数组的元素是引用类型,即每个数组里存储的元素还是引用,只想另一块内存,这里的内存存储了有效数据。
例:
1class Fruit{
2 public String name;
3 public void show() {
4 System.out.println("我是"+name);
5 }
6}
7
8public class HelloWorld2 {
9 public static void main(String[] args) {
10 Fruit []fruit=new Fruit[2];//声明并初始化,元素为null
11
12 Fruit apple=new Fruit();//创建实例apple
13 apple.name="apple";
14 Fruit orange=new Fruit();//创建实例orange
15 orange.name="orange";
16
17 fruit[0]=apple;//赋值
18 fruit[1]=orange;
19
20 orange.show();//显示
21 fruit[1].show();
22 }
23
24}
1我是orange
2我是orange
初始化数组以及变量声明初始化完成后,堆栈空间存储分配如下:
执行语句
fruit[0]=apple;//赋值
fruit[1]=orange
后,堆栈空间存储分配如下:
因此如果对apple进行le修改,那么fruit[0]也会随之改变,因为两者指向的是同一块地址。
多维数组
java没有多维数组,但提供了支持多维数组的语法。
二维数组语法
type[][] arrName;
//实质上还是一维数组,只是其数组元素是指向一维数组的引用
二维数组初始化
arrName=new type[length][];
//相当于初始化了一个一维数组,数组长度为length,系统为数组内元素赋值为null
或
arrName=new type[length1][length2];
例:
1public static void main(String[] args) {
2 int[][] a;
3 a=new int[4][];
4 System.out.println("初始输出");
5 for(int i=0;i<a.length;i++) {
6 System.out.println(a[i]);
7 }
8 System.out.println("初始化后a[0]存储情况");
9 a[0]=new int[2];
10 a[1]=new int[4];
11 a[0][1]=7;
12 for(int i=0;i<a[0].length;i++) {
13 System.out.println(a[0][i]);
14 }
15 System.out.println("初始化后a存储情况");
16 for(int i=0;i<a.length;i++) {
17 for(int j=0;j<a[i].length;j++) {
18 System.out.println(a[i][j]);
19 }
20 }
21}
1初始输出
2null
3null
4null
5null
6初始化后a[0]存储情况
70
87
9初始化后a存储情况
100
117
120
130
140
150
16Exception in thread "main" java.lang.NullPointerException
17 at Test/test2.HelloWorld2.main(HelloWorld2.java:32)
初始输出时,数组声明未初始化,数组长度为4,数组元素为一维数组的引用。因此输出4个null
执行完
a[0]=new int[2];
a[1]=new int[4];
后,a[0]表示一个指向一个长度为2的一维数组引用。默认数组初始化为0。
注意:出现了异常NullPointerException,因为没有初始化a[2],a[3],两者皆为null,在访问a[2].length时,出现异常
数组工具类
需要import java.util.Arrays;
int binarySearch(type[] a,type key);//二分查找
int binarySearch(type[] a,int from,int to,type key);//二分查找,从from到to,查找key
type[] copyOf(type[] original,int newLength)://复制数组,返回长度为newLength的数组
//若原数组长度<newLength,则新数组后填充为0,若>,则取原数组长度的前几个元素。
type[] copyOfRange(type[] original,int from,int to)://复制f从from到to的元素
int []a= {1,2,3,4};
int []b;
b=Arrays.copyOfRange(a, 1, 3);
for(int aa:b) {
System.out.println(aa);
}
输出:2,3.、
即复制original[form]~orifinal[to-1]
boolean equals(type[] a,type[] b)://判断数组a,b是否相等(长度和元素值均相等)
void fill(type[] a,int b)://将a的每一个元素都填充为b
void fill(type[] a,int from,int to,int b)://同上原理
void sort(type[] a)://对数组a进行排序,增序
void sort(type[] a,int from,int to)://从a[from]~a[to-1]进行排序
String toString(type[] a)://将数组转换成一个字符串
~int []a= {3,2,1,4,5,0,7};
~String s=Arrays.toString(a);
输出:[3, 2, 1, 4, 5, 0, 7]