数组的定义:数组是相同类型的元素组成的集合
数组中的元素按照线性顺序排列,除了第一个和最后一个以外,每一个元素都有唯一的前驱元素,每一个元素都有唯一的后继元素。
注意:数组需要通过下标来标识每一个元素,下标从0开始,最大元素到数组个数-1
数组初始化的三种方式:
1、定义一个数组且只声明数组长度
int[] array1 = new int[5];//设置当前数组可以存储的元素个数
2、直接在定义的数组后赋值
int[] array2 = new int[]{1, 3, 5};
3、直接将数组赋值
int[] array3 = {1, 3, 5, 7};
其中int是基本数据类型,int[]不是基本数据类型,叫做引用类型。 注意: 1、数组中的数必须为相同类型的元素 2、数组是一种引用类型 3、数组中的元素会自动初始化
重点提示: 1、java规定,数组的长度初始化后,不可改变 2、整数类型自动初始化为0 浮点类型自动初始化为0.0 布尔类型自动初始化为false 3、数组字面量表示法不允许先声明后初始化
数组的读写:
可以先定义一个数组,然后对数组中的某个位置进行赋值,若未赋值,则初始为0。
ar1 = new int[5];
System.out.println(ar1[0]);
ar1[0] = 100;
ar1[1] = 200;
System.out.println(ar1[0]);
输出结果:
0
100
数组的遍历:
对于数组的遍历一般采用for循环。这样即可访问整个数组。
for (int i = 0; i < ar1.length; i++) {
System.*out*.print(ar1[i] + "-");
}
数组的排序
冒泡排序
冒泡排序原理:从数组第一个开始,依次比较两个相邻的元素,如果是按照从小到大排列的话,如果相邻两元素前一个比后一个大,则交换两者位置,然后依次往后遍历,遍历次数为n-1(n为数组长度)次。
System.*out*.println("冒泡排序");
long time = System.*currentTimeMillis*();
int[] ar2 = new int[10];
for (int i = 0; i < ar2.length; i++) {
ar2[i] = (int) (Math.*random*() * ar2.length + 10);
System.*out*.print(ar2[i] + "-");
}
System.*out*.println();
//把十个元素中的最大值进行比较放到最后的位置
for (int i = 0; i < ar2.length - 1; i++) {
for (int j = 0; j < ar2.length - 1; j++) {
if (ar2[j] > ar2[j + 1]) {
int te = ar2[j];
ar2[j] = ar2[j + 1];
ar2[j + 1] = te;
}
}
}
time = System.currentTimeMillis() - time;
System.out.println("排序后的数组:");
for (int i = 0; i < ar2.length; i++) {
System.out.print(ar2[i] + "_");
}
System.out.println();
选择排序
选择排序:选择数组中的第一个元素与数组中剩余的元素依次进行比较,假设要按照从小到大排列,如果它比后面的数大,则交换两者位置。然后依次往后选择一个数,与其后面未比较过的数进行比较,重复上述操作。
//选择排序
int[] array5 = new int[10];
for (int i = 0; i < array5.length; i++) {
array5[i] = (int) (Math.*random*() * array5.length + 10);
System.*out*.print(array5[i] + "-");
}
System.*out*.println();
for (int i = 0; i < array5.length-1; i++) {
for (int j = i+1; j < array5.length; j++) {
if(array5[i]>array5[j]){
int t=array5[i];
array5[i]=array5[j];
array5[j]=t;
}
}
}
System.*out*.println("选择排序后结果:");
for (int i = 0; i < array5.length; i++) {
System.*out*.print(array5[i]+"-");
}
System.*out*.println();
插入排序
插入排序:将一个元素插入到已经排列好的有序表中,它利用双层循环,外循环遍历整个数组,内循环是对当前元素前面的有序表进行查找对比,依次与前面的元素进行对比,插入到合适的位置。
int[] array6=new int[10];
for (int i = 0; i < array6.length; i++) {
array6[i] = (int) (Math.*random*() * array6.length + 10);
System.*out*.print(array6[i] + "-");
}
System.*out*.println();
for (int i = 0; i < array6.length-1; i++) {
for (int j = i; j >-1; j--) {
if(array6[j]>array6[j+1]){
int te=array6[j];
array6[j]=array6[j+1];
array6[j+1]=te;
}
}
}
System.*out*.println("插入排序后结果:");
for (int i = 0; i < array6.length; i++) {
System.*out*.print(array6[i]+"-");
}
数组的扩容
因为在java中数组定长,所以对于数组的扩容即为创建一个新的数组,将原数组的值赋值过去。
1、使用关键字System.arraycopy(a,b,c,d,e)
-
a表示原数组
-
b表示原数组下标开始的位置,包含当前下标元素
-
c表示目标数组
-
d表示目标数组下标开始的位置,从当前下标元素开始
-
e表示从原数组中下标开始位置复制的元素个数
2、Arrays.copy0f(a,b)
-
a表示原数组
-
b表示从原数组中获取的元素个数,注意:只能从第一个元素开始
int[] a1=new int[5];
System.out.println("扩容前的a1");
for (int i = 0; i < a1.length; i++) {
a1[i] = (int) (Math.*random*() * a1.length + 10);
System.*out*.print(a1[i] + "-");
}
System.out.println();
int[] a2=new int[a1.length+1];
System.arraycopy(a1,0,a2,0,a1.length);
a1=a2;
System.out.println("第一次扩容的a1");
for (int i = 0; i < a1.length; i++) {
System.out.print(a1[i] + "-");
}
a1=Arrays.copyOf(a1,a1.length+2);
System.out.println("第二次扩容后的a1:");
for (int i = 0; i < a1.length; i++) {
System.out.print(a1[i]+"-");
}
System.out.println();
小作业:
在一个10个元素的随机数组中,找到最大值和最小值并且要求把最大值放在数组最后一个元素的下一个位置
int[] arra = new int[10];
for (int i = 0; i < arra.length; i++) {
arra[i] = (int) (Math.random() * 100);
System.out.print(arra[i] + "-");
}
System.out.println();
int temp = arra[0];
for (int i = 0; i < arra.length; i++) {
if (temp < arra[i]) {
temp = arra[i];
}
}
System.out.println("最大值为" + temp);
int[] arraCopy = new int[arra.length + 1];
for (int i = 0; i < arra.length; i++) {
arraCopy[i] = arra[i];
}
arraCopy[arraCopy.length - 1] = temp;
arra = arraCopy;
for (int i = 0; i < arra.length; i++) {
System.out.print(arra[i] + "-");
}
System.out.println();
//利用扩容的关键字进行优化
Arrays.sort(arra);
System.out.println("排序后的数组");
for (int i = 0; i < arra.length; i++) {
System.out.print(arra[i]+"-");
}
System.out.println();
int[] arraCopy2=Arrays.*copyOf*(arra,arra.length+1);
arraCopy2[arraCopy2.length-1]=arra[arra.length-1];
System.out.println("扩容后的数组:");
for (int i = 0; i < arraCopy2.length; i++) {
System.out.print(arraCopy2[i]+"-");
}
System.out.println();
}
}