Java数组

251 阅读6分钟

数组基础

  • 数组要求数组元素具有相同数据类型

  • 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]