数组的概念 |
数组是一种常见的数据结构,可用于存储多个数据,每个数组元素存放一个数据。可使用数组元素的索引来对其进行访问。
(1)特点
- 特点一:
一个数组只能存储一种数据类型的数据,可以是基本类型,也可以是引用类型的数据。比如定义了int类型的数组,里面就不能存放char类型的数据。 - 特点二:
数组本身是一种引用类型。这个在数据类型的总结中提到过,引用类型包括类,接口,数组等。例如int是一个基本类型,但是int[]是一种引用类型。
(2)和集合的异同
- 同:
都是用来存储多个数据的。 - 异:
a、数组是强类型,存入时会对其进行检查。集合是弱类型,存入时不会检查,所以如果存入一个不同类型的数据,就会在运行时会报错。java5之后,引用了泛型来解决这个问题。
b、数组里可以存放基本类型和引用类型。集合里只能存放引用类型。
c、数组一旦定义了,长度不可变化。集合中存放的元素的数量可以变化。
d、数组无法保存有映射关系的数据,比如语文-80,数学-90。但是集合中可以。
数组的定义和初始化 |
数组的初始化有两种:静态初始化和动态初始化。静态初始化由程序员显示指定每个数组元素的初始值,有系统决定数组长度。动态初始化程序员只指定数组长度,由系统为数组元素分配初始值。定义和初始化的方式有多种,小编只列举常用的。
//定义+静态初始化
int [] a={5,6,7};
//定义+动态初始化
int[] b=new int[3];
数组的使用 |
(1)为元素赋值和访问数组元素值
//为元素赋值
a[1]="Mei";
//访问数组元素值
a[1];
(2)获得数组的长度
使用for循环输出每个数组元素的值:
for(int i=0;i<a.length;i++){
System.out.println(a[i]);
}
使用foreach循环输出每个数组元素的值:(推荐)
for(int x:a){
System.out.println(x);
}
(3)采用循环方式为每个数组元素赋值
使用foreach循环迭代数组元素时,循环变量相当于一个临时变量,所以对其进行赋值,并不能改变真正的数组元素的值。如果想改变数组元素的值,可使用for循环。具体使用过程如下。
for (int i=0;i<a.length;i++){
a[i]=i+10;
}
Arrays类 |
Arrays类里定义了几个可用于操作数组的方法,比如:
//定义了两个数组
int [] c={5,6,7};
int[] d={3,4,5,9};
//判断数组c、d是否完全相等(数组元素能够一一对应相同)
Arrays.equals(c,d);
//将一个数组转换成一个字符串。将输出[5,6,7]
Arrays.toString(c);
//将数组的第3个、第4个元素赋值为1
Arrays.fill(c,2,4,1);
//对c进行排序
Arrays.sort(c);
//对c进行并发排序,这个性能比sort()更高
Arrays.parallelSort(c);
内存分析 |
(1)数组的内存分析
数组属于引用类型,我们讨论数组在内存中的存储,也就是在讨论引用类型在内存中是怎么存储的。数组的引用变量存储在栈中,数组本身存储在堆中,引用变量指向数组本身。
在上图中,c,d指向各自的数组本身,如果执行了d=c;代码后,c就将自己的引用地址赋给了d。d原本指向的地址就会因为失去引用而被垃圾回收器回收。就像下图。
(2)基本类型数组的初始化
基本类型数组的初始化的内存分布,和上上个图是一样的。
(3)引用类型数组的初始化
以下代码是要定义一个Person类这个引用类型的数组students,其内有两个数组元素xiaoming、xiaohong。
//定义并初始化一个Person类型的数组students
Person[] students=new Person[2];
//创建一个Person类的对象xiaoming,并对其的age,height属性进行赋值。
Person xiaoming=new Person();
xiaoming.age=15;
xiaoming.height=1.83;
//同理,再创建另一个对象xiaohong。
Person xiaohong=new Person();
xiaohong.age=20;
xiaohong.height=1.65;
//将xiaoming、xiaohong两个变量的值分别赋值给数组元素的第一个值、第二个值
students[0]=xiaoming;
students[1]=xiaohong;
内存分析图如下: