八 数组(重点)
8.1 什么是数组
-
程序=算法+数据结构
-
数据结构:把数据按照某个特定的结构存储,设计一个合理的数据结构是数据问题的关键。(存储数据的结构)
-
数组:最基本的数据结构(本质–存储同类型的元素的集合)
-
数组特定结构:相同类型组成的数据集合下标
-
表现方式:通过元素的下标进行访问,且下标从0开始,最大元素下标为数组长度。
/**
* 数组
* @author Regulus
*/
public class Testarray {
public static void main(String[] args) {
//1.我的第一个数组
int[] arr = {1,2,3,4};
System.out.println(arr.length);//数组长度
System.out.println(Arrays.toString(arr)); //以字符串的形式打印数组
//2.数组的遍历
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
}
}
8.2 数组的定义
8.2.1 声明数组的三种方法
数据类型[] 数组名 = new 数据类型[数组长度]
int[] arr1 = new int[5];
说明:
int:数组的元素类型必须为int
arr1:数组的名称
new:创建了一个数组对象
5:数组的长度
1.初始值为int的默认值
2.元素为{0,0,0,0,0}
8.3 数组的初始化
8.3.1 基本类型数组的创建其元素值是数组类型决定的
- 整型:0
- 浮点型:0.0
- 字符型:空字符 – “\0”
- 布尔型:false
8.3.2 数组的初始化
数据类型[] 数组名 = new 数据类型[数组长度]
int[] arr1 = new int[5];
数据类型[] 数组名 = new 数据类型[]{元素数据}
int[] arr2 = new int[]{0,1,2,3};
数据类型[] 数组名 = {元素数据}
int[] arr3 = {0,1,2,3,4};直接初始化元素值,长度为元素的个数
1.这种声明只能对其初始化不能用于赋值
2.编译错误:
public static void main(String[] args) {
//错误(没有new一个空间就开始赋值)
int[] arr3;
arr3= {0,1,2,3,4};
//正确
int[] arr2 = {0,1,2,3,4};
int[] arr3 = new int[5];
arr3[0]=0;
arr3[1]=1;
arr3[2]=2;
arr3[3]=3;
arr3[4]=4;
}
3.对数组的赋值只是对其元素进行赋值,不能对数组定义赋值。
4.可以采用第二种方式先用new创建空间,再赋值arr = new []{1,2,3,4};
8.4 数组的访问
8.4.1 获取数组的长度
//获取数组的长度
int a[] = new int[]{3,4,5,6};
int len =a.length; //数组的,length 属性
System.out.println(len);//4
8.4.2 通过下标访问数组元素
//通过下标访问数组元素
int[] b = {4,6,9,8,7};//b[0] b[1] b[2]...b[4]
//0.获取最后一位元素值。
System.out.println(b[b.length-1]);//7
System.out.println("-------");
//1.获取元素下标为奇数的元素
//循环问题 条件:数组的长度 变量:第一个元素 改变条件:%2==1
for (int i = 0; i < b.length; i++) {
if(i % 2 == 1) {
System.out.println(b[i]);
}
}
//2.交换元素下标为2和3的元素位置
int temp = b[2];
b[2] = b[3];
b[3] = temp;
System.out.println(b[2]);
System.out.println(b[3]);
8.4.3 遍历数组元素–for循环
基本for循环
int[] a2 = new int[]{3,6,7,9};
//基本for循环
for (int i = 0; i < a2.length; i++) {
System.out.print(a2[i] + " ");
}
增强for循环
int[] a2 = new int[]{3,6,7,9};
//jdk1.8提供了增强for循环
for (int i : a2) {
System.out.print(i+" ");
}
8.4.4 案例(产生一个随机数组,元素个数为10,将数组正序和逆序输出)
//1.定义数组,长度为自定义=l
System.out.println("输入数组的长度:");
Scanner scan = new Scanner(System.in);
int l = scan.nextInt();
int []arr = new int[l];
//2.通过元素下标赋值随机数
for (int i = 0; i < num.length; i++) {
//arr[i] = (int)(Math.random()*100);
Random ran = new Random(); //生成随机数
num[i] = ran.nextInt(100); //生成一个随机的int值,该值介于[0,100)的区间
}
//3.正序遍历
for (int i = 0; i < num.length; i++) {
System.out.print(num[i] + " ");
}
System.out.println();
//4.逆序遍历
for (int i = num.length-1; i >= 0; i--) {
System.out.print(num[i] + " ");
}
8.4.5 案例(求出数组中的最大值)
//求数组最大值
public static void main(String[] args) {
int num[] = new int[]{3,4,5,6};
int max=0;
for (int i = 0;i<num.length;i++){
if(max < num[i]){
max = num[i];
}
}
System.out.println(max);
}
8.5 数组的复制
8.5.1 System.arraycopy()方法
public static void arrayCopy(Object src,int srcPos,Object dest,int desPos,int length)
- src:原数组
- srcPos:原数组的起始位置
- dest:目标数组
- destPos:目标数组的起始位置
- length: 复制的长度
在import java.util.Arrays;包中实现
//数组的复制
public static void main(String[] args) {
int [] c1= {1,2,3,4,5,6};
int [] c2=new int[6];
System.arraycopy(c1,1,c2,0,3);
System.out.println(Arrays.toString(c2)); //[2, 3, 4, 0, 0, 0]
}
如果目标数组小于需要copy的长度时会报出ArraysIndexOutOfBoundsException
8.5.2 System.arraycopyOf()方法
java.util.Array类实现了数组复制的方法Array.copyOf(类型[]src,int length)
- srcL:源数组
- length:复制的长度
public static void main(String[] args) {
int [] c1= {1,2,3,4};
int [] c2=new int[4];
System.out.println("s:"+c1.length); //4
c2 = Arrays.copyOf(c1,3);
System.out.println(Arrays.toString(c2)); //截取 [1, 2, 3]
c2 = Arrays.copyOf(c1,6);
System.out.println(Arrays.toString(c2)); //扩容 [1, 2, 3, 4, 0, 0]
System.out.println("t:"+c1.length); //3
}
总结:
当复制的长度小于新数值,则截取;
当复制的长度大于新数值,则扩容。
public static void main(String[] args) {
int []arr = {1,2,3,4,5,6,7,8,9};
System.out.println(Arrays.toString(arr));
int temp = arr[2];
arr[2] = arr[arr.length-1];
arr[arr.length-1] = temp;
arr = Arrays.copyOf(arr, arr.length-1);
System.out.println(Arrays.toString(arr));
}