数组:
数组是具有多个连续存储的相同数据类型的变量组成的集合体。
数组元素:
构成一个数组的每一个数据都是数组元素。
数组下标:
表示数组元素在数组中的位置,用整数表示,从0开始,依次加一,也可以叫做索引(index),下标的界限为0到数组长度(数组大小)-1,下标如果是负数,或者下标超过了数组长度-1,会发生越界(ArrayIndexOutOfbounds)。
使用数组的步骤:
1.定于数组
2.为数组元素分配内存
3.数组元素初始化
4.使用数据
数组长度:
数组中元素的个数,也称为数组大小,获取数组长度的方法为数组名.length,数组的长度是在为数组分配内存时确定大小,大小不可以改变,如果需要扩大或者缩小,需要重新定义一个数组。
数组的定义和使用:
数据类型 []数组名; 或者 数据类型 数组名[]; 定义数组本质上就是向JVM虚拟机申请数据。JVM将内存划分为栈、堆、方法区几个区域,不同的区域存储不用类别的数据。JVM在定义数组时是将数组的名称存储在栈中,栈是一个先进后出的数据结构。指出数组元素的个数,通过new运算符,让系统为数组元素分配内存空间,数组元素存储在堆中。数组元素的初始化就是第一次赋值,没有初始化的数组元素为默认值。
数组的数据结构(线性表):
全名为线性存储结构,使用线性表存储数据的方式可以理解为把所有数据用一根线串起来,存储到物理空间中。
数组的排序:
排序算法有很多种,常用的有冒泡排序、插入排序、选择排序、快速排序、堆排序、归并排序、希尔排序、二叉树排序、计时排序等等。
列举几个我学过的例子:
冒泡排序代码案例
public static void main(String[] args) {
int score[] =new int[80000]; // 定义数组大小
Random random =new Random();
for (int i =0; i < score.length; i++) {
score[i] = random.nextInt(80000); // 随机生成数组元素
}
long start = System.currentTimeMillis(); // 开始计时
for (int i =0; i < score.length-1;i++){
for (int j =0;j < score.length-i-1;j++){
if (score[j] > score[j +1]) {
int tmp = score[j];
score[j] = score[j +1];
score[j +1] = tmp; //数据进行两两比较,较小的放在前面,较大的放在后面,依次类推,直至全部确定位置,排序完毕
}
}
}
long end = System.currentTimeMillis();// 计时结束
System.out.println(end-start);// 输出排序所用的时间
}
数据进行两两比较,较小的放在前面,较大的放在后面,依次类推,直至全部确定位置,排序完毕。
插入排序代码案例
public static void main(String[] args) {
int arr[] =new int[80000]; // 定义数组大小
for (int i=0 ;i <80000;i++){
arr[i] = (int)(Math.random()*80000); // 随机生成数组元素
}
long start = System.currentTimeMillis(); //计时开始
for (int i =0; i < arr.length ; i++) {
int j = i;
while(j >0){
if(arr[j] < arr[j-1]){
int tmp;
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
j--;
}
else{
break;
}
}
} // 从第二个数据开始,依次和前面的数据进行两两比较,比前面的数据小则继续进行比较,比前面的数据大则插入到该数据的后方,到了下标为0的位置则直接插入,依次类推,直至全部确定位置,排序完毕。
long end = System.currentTimeMillis(); //计时结束
System.out.print(end - start); // 输出排序所用时间
}
从第二个数据开始,依次和前面的数据进行两两比较,比前面的数据小则继续进行比较,比前面的数据大则插入到该数据的后方,到了下标为0的位置则直接插入,依次类推,直至全部确定位置,排序完毕
选择排序案例代码
public static void main(String[] args) {
int arr[] =new int[80000]; // 定义数组的大小
Random input =new Random();
for (int i =0; i < arr.length; i++) {
arr[i] = input.nextInt(80000); // 随机生成数组元素
}
long start = System.currentTimeMillis(); // 计时开始
for (int i =0; i < arr.length-1; i++) {
int minIndex = i;
int min = arr[i];
for (int j = i+1; j < arr.length; j++) {
if (arr[j] < min) {
min = arr[j];
minIndex = j;
}
}
int tmp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = tmp;
} // 选中下标为0的数据和后面的数据两两进行比较,如果后者比前者小,则记录后者的下标,然后用后者和后面的数据进行两两比较,一轮比较完成后,最后那个被记录下标的元素与第一个数据比较,较小则交换位置并且确定位置,之后选中下标为1的数据进行上述操作,每比较一轮确定一个数据的位置,直至全部确定,排序完毕。
long end = System.currentTimeMillis(); //计时结束
System.out.println(end-start); // 输出排序所用的时间
System.out.println(Arrays.toString(arr)); // 输出随机生成数组元素的数组
}
选中下标为0的数据和后面的数据两两进行比较,如果后者比前者小,则记录后者的下标,然后用后者和后面的数据进行两两比较,一轮比较完成后,最后那个被记录下标的元素与第一个数据比较,较小则交换位置并且确定位置,之后选中下标为1的数据进行上述操作,每比较一轮确定一个数据的位置,直至全部确定,排序完毕
使用数组时的常见问题:
(1)下标越界异常
例如一个拥有五个元素的数组,下标分别为0、1、2、3、4,输出时下标不能大于4,输出的下标大于4时,系统会提示运行该程序时发生了java.labg.ArrayIndexOutOfBoundsException异常,表示下标越界了,数组下标超过0——数组长度-1的范围的值就会发生下标越界异常。
(2)没有分配内存空间
例如一个数组score[] = null;输出时系统提示运行该程序时发生了java.lang.NullPointerException异常,表示空指针异常,这个程序只为数组名在栈中分配了内存,但是没有在堆中为数组元素分配内存。
(3)语法错误
数组类型 数组名[] //中括号中不允许写长度;数组类型 数组名 = new 数组类型[] {数组元素} //直接为数组元素初始化不允许指定数组长度;错误类型:数组类型 数组名[];换行 数组名 = {数组元素} //直接初始化数组元素的代码必须写在同一行。
二维数组
定义方法:数据类型 [][]数组名 或者 数据类型 数组名[][],第一个[]表示第一维,第二个[]表示第二维。
二维数组中数据的元素类型必须相同,表示一个一维数组,这个一维数组的每一个元素又是一个一维数组。
Arrays类
常用方法:
1.equals(数组名1,数组名2) 返回类型为boolean 用于比较两个数组是否相等。
2.sorry(数组名) 返回类型为void 对数组的元素进行排序。
3.toString(数组名) 返回类型为String 把一个数组转换成一个字符串。
4.fill(数组名1,元素值) 返回类型为void 把数组的所有元素都赋值成元素值。
5.copyOf(数组名1,length) 返回类型与数组1数据类型相同 把数组复制成一个长度为length的新数组。
6.binarySearch(数组名,元素值) 返回类型为int 查询元素值在数组中的下标。
数组的输出:
Systom.out.print(数组名称) 这样输出的是数组的内存地址编号 Systom.out.print(Arrays.toString) 这样输出的是数组元素