day06——数组

day06

一、一维数组

理解:一组数据的容器

概念:

  1. 数组为引用数据类型
  2. 数组中的数据,叫做元素
  3. 元素都有编号,叫做下标/索引
  4. 下标从0开始
  5. 数组中的元素是连续的(内存中是挨在一起的)
  6. 数组初始化完成后,该数组长度不可变
  7. 数组作为容器,需要管理数据,但是数组初始化后长度不可更改,意味着数组只能修改和查询,不能添加和删除(只能通过创建新数组的方式来进行数组的扩容和删除)

数组的声明:

//数据类型[] 数组名;
int[] arr;
//数据类型 数组名[];
int arr[];

1. 数组的初始化

1.1 静态初始化

数据由程序员指定,长度由系统分配

  1. 声明时初始化
int[] arr = new int[]{1,2,3,4,5};
  1. 先声明,再初始化
int[] arr;
arr = new int[]{1,2,3,4,5};
  1. 简化(1)
int[] arr = {1,2,3,4,5};
//初始化数组
int[] arr = {1,2,3,4,5};
//设置指定下标上的元素
num[0] = 6;
//获取指定下标上的元素
System.out.println(arr[0]);//6
//获取元素个数
System.out.println(arr.length);
//遍历数组1---for循环遍历(使用下标)
for(int i = 0;i<arr.length;i++){
    System.out.println(arr[i]);
}
//遍历数组2---foreach/增强for循环遍历(不使用下标)
for(int element:arr){
    System.out.println(element);
}

1.2 动态初始化

//初始化数组,设定长度为3
int[] arr = new int[3];
//设置指定下标上的元素
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
//遍历
for(int element:arr){
    System.out.println(element);
}
//1
//2
//3

静态初始化vs动态初始化

  1. 知道数据,使用静态初始化
  2. 知道长度,使用动态初始化

2. 一维数组的排序

2.1 冒泡排序

口诀:

n个数字排序

两两相比小靠前

外层循环n-1

内层循环n-1-i

//声明并初始化数组
int[] arr = {81,53,2,67,18};
//排序
for(int i = 0;i<arr.length-1;i++){
	for(int j = 0;j<arr.length-1-i;j++){
		if(arr[j] > arr[j+1]){
			int temp = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = temp;
		}
	}
}
//遍历	
for(int element : arr){
	System.out.println(element);
}

3. 一维数组的查找

3.1 线性查找

int[] arr = {81,53,2,67,18};
int num = 2;//要查询的数据	
for(int i = 0;i<arr.length;i++){
	if(arr[i] == num){
		System.out.println("查找到元素了,元素的下标为:" + i);
	}
}

3.2 二分法查找/二叉搜索查找

必须先排序,再查找

 2 , 18 , 53 , 67 , 81
 ↓        ↓         ↓
start     mid      end 
int[] arr = {81,53,2,67,18};
//排序 - 2,18,53,67,81
Arrays.sort(arr);
//查询目标
int num = 2;
//查询起始下标
int start = 0;
//查询末尾下标
int end = arr.length-1;

while(start <= end){
    //查询中间下标
	int mid = (start+end)/2;
	//查询目标小于查询中间下标
	if(num < arr[mid]){
        //查询末尾下标左移
		end = mid-1;
    //查询目标大于查询中间下标
	}else if(num > arr[mid]){
        //查询起始下标右移
		start = mid+1;
	}else{
        //查询目标等于查询中间下标
		System.out.println("查找到元素了,元素的下标为:" + mid);
	break;
	}
}

4. 数组的复制

4.1 浅表复制

//源数组/原数组/数据源
String[] arr = {"红","绿","蓝"};
//新数组
String[] newArr = arr;
//修改源数组的数据
arr[1] = "黄";
//遍历新数组
for(String element : newArr){
	System.out.println(element);
}
//红
//黄
//蓝

缺点:修改源数组,新数组的数据也会发生改变
原因:源数组和新数组都是指向同一个对象

4.2 深层复制

//源数组/原数组/数据源
String[] arr = {"红","绿","蓝"};
//新数组
String[] newArr = new String[arr.length];
//遍历源数组,并将元素赋值给新数组
for(int i = 0;i<arr.length;i++){
    newArr[i] = arr[i];
}
//修改源数组的数据
arr[1] = "黄";
//遍历新数组
for(String element : newArr){
	System.out.println(element);
}
//红
//绿
//蓝

5. 数组的扩容

//源数组/原数组/数据源
String[] arr = {"红","绿","蓝"};	
//计算新长度(新长度是原来长度的1.5倍)
int oldCapacity = arr.length;//3
int newCapacity = oldCapacity + (oldCapacity>>1);//4
//创建新数组
String[] newArr = new String[newCapacity];		
//遍历源数组,将源数组的元素赋值给新数组
for(int i = 0;i<arr.length;i++){
	newArr[i] = arr[i];
}		
//将新数组的内层地址赋值给源数组
arr = newArr;		
//遍历源数组
for(String element : arr){
	System.out.println(element);
}
//红
//绿
//蓝
//null

6. 数组的删除

6.1 数组的删除1

//源数组/原数组/数据源
String[] arr = {"红","绿","蓝"};	
//创建新数组 -- [null,null]
String[] newArr = new String[arr.length-1];
//遍历源数组,将除了"绿"以外的元素赋值给新数组
int index = 0;
for(String element : arr){
	if(!element.equals("绿")){
		newArr[index] = element;
		index++;
	}
}
//将新数组的内存地址赋值给源数组
arr = newArr;
//遍历源数组
for(String element : arr){
	System.out.println(element);
}
//红
//蓝

缺点:数组空间会越来越小

6.2 数组的删除2

//源数组/原数组/数据源
String[] arr = {"红","绿","蓝"};
//数据的位移 -- ["红","蓝","蓝"]
for(int i = 1;i<arr.length-1;i++){
	arr[i] = arr[i+1];
}	
//把最后一个元素赋值为null
arr[arr.length-1] = null;
//遍历源数组
for(String element : arr){
	System.out.println(element);
}
//红
//蓝
//null

7. 数组作为参数和返回值

注意:

  1. 数组可以作为参数,传入方法
  2. 方法如果想返回多个数据,可以将多个数据放在一个数组中
public static void main(String[] args){
    int[] arr = {81,53,2,67,18};
    //调用获取最大值和最小值的方法
    int[] maxAndMin = getMaxAndMin(arr);
    System.out.println("最大值为:" + maxAndMin[0]);
    System.out.println("最小值为:" + maxAndMin[1]);
}

public static int[] getMaxAndMin(int[] arr){
    //假设下标为0的元素为最大值和最小值
    int max = arr[0];
    int min = arr[0];
    for(int i = 1;i<arr.length;i++){
        if(max < arr[i]){
            max = arr[i];
        }
        if(min > arr[i]){
            min = arr[i];
        }
    }
    return new int[]{max,min};
}

8. 可变参数

可变参数就是数组

public static void main(String[] args){	
	//注意:1,54,7,32,41,235,34,8数据作为数组的元素
	int max = getMax(1,54,7,32,41,235,34,8);
	System.out.println("最大值为:" + max);
}

//注意:int... arr底层就是数组
public static int getMax(int... arr){
	int max = arr[0];
	
	for(int i = 1;i<arr.length;i++){
		if(max < arr[i]){
			max = arr[i];
		}
	}
	return max;
}

错误写法:

public static void method(int... arr,int num){
}
//报错-The variable argument type int of the method method must be the last parameter
//原因-可变参数后不能再接参数

二、二维数组

理解:二维数组中包含了多个一维数组

数组的声明:

//数据类型[][] 数组名;
int[][] arr;
//数据类型 数组名[][];
int arr[][];

1. 二维数组的初始化

1.1 静态初始化

//声明并初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5,6,7}};
//声明,再初始化
//int[][] arr2;
//arr2 = new int[][]{{1,2,3},{4,5,6,7}};
//简化
//int[][] arr3 = {{1,2,3},{4,5,6,7}};
//设置指定数组指定下标上的元素
arr1[1][3] = 999;
//获取指定数组指定下标上的元素
System.out.println(arr1[1][3]);//999
System.out.println("-------------------------------------");
//获取二维数组长度
System.out.println("二维数组长度:"+arr1.length);
System.out.println("-------------------------------------");
//获取二维数组中一维数组的长度
System.out.println("二维数组中第一个一维数组的长度"+arr1[0].length);
System.out.println("二维数组中第二个一维数组的长度"+arr1[1].length);
System.out.println("-------------------------------------");
//遍历数组1
for (int i = 0; i < arr1.length; i++) {
    for (int j = 0; j < arr1[i].length; j++) {
        System.out.println(arr1[i][j]);
    }
}			
System.out.println("-------------------------------------");
//遍历数组2
for (int[] arrs : arr1) {
    for (int element : arrs) {
        System.out.println(element);
    }
}

1.2 动态初始化

//声明并初始化
int[][] arr1 = new int[2][3];//2-两个一维数组/3-每个一维数组3个元素
//声明,再初始化
//int[][] arr2;
//arr2 = new int[2][3];
//设置指定数组指定下标上的元素
arr1[0][0] = 1;
arr1[0][1] = 2;
arr1[0][2] = 3;
//获取指定数组指定下标上的元素
System.out.println(arr1[0][0]);
System.out.println(arr1[0][1]);
System.out.println(arr1[0][2]);
System.out.println("-------------------------------------");
for (int[] is : arr1) {
    for (int i : is) {
        System.out.println(i);
    }
}

需求:创建一个二维数组,其中第一个一维数组长度为3,第二个一维数组长度为4

//声明二维数组,长度为2
int[][] arr = new int[2][];
//声明第一个一维数组,长度为3
int[] s1 = new int[3];
//声明第一个一维数组,长度为4
int[] s2 = new int[4];
//分别将s1和s2的内存地址赋值给源二维数组中的一维数组的引用
arr[0] = s1;
arr[1] = s2;
//遍历数组
for (int[] ss : arr) {
    for (int element : ss) {
        System.out.println(element);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值