史上最全一,二维数组详解

目录

一维数组

含义

静态初始化

动态初始化

数组的排序 -- 冒泡排序

数组的查找

        顺序查找

        二分法查找

数组的复制

        数组的复制1

        数组的复制2

数组的扩容

数组的删除

        数组的删除1

        数组的删除2

数组作为方法的参数和返回值

可变参数

二维数组

静态初始化

动态初始化


一维数组

含义

       含义 :一组数据的容器(存放多个数据的容器)

        注意:

                1.数组是引用数据类型

                2.数组中的数据,叫做元素

                3.每个元素都是编号,叫做下标/索引

                4.索引从0开始

                5.数组在内存中开辟的空间是连续的

                6.数组一旦初始化后,长度不可改变(意味着数组不可以添加和删除)

数组的声明:数据类型[] 数组名;

静态初始化

静态初始化:由程序员指定数据,系统自动分配空间

静态初始化1:

    String[] names = new String[]{"小张1","小张2","小张3","小张4","小张5"};

静态初始化2:先声明,再初始化

	String[] names;
	names = new String[]{{"小张1","小张2","小张3","小张4","小张5"};

静态初始化3:简化静态初始化1的写法

	String[] names = {{"小张1","小张2","小张3","小张4",小张5"};

通过下标设置元素:

	names[2] = "牛牛";

通过下标获取元素:

	String str = names[2];

获取数组中元素的个数:

	int len = names.length;

遍历数组1 -- for循环:

	for(int i = 0;i<names.length;i++){
		System.out.println(names[i]);
	}

遍历数组2 -- foreach/增强for循环

    for(String element : names){//依次遍历数组中的元素并赋值给element
        System.out.println(element);
    }

for循环 vs foreach循环:

                遍历时使用到下标,就使用for循环 ​

                遍历时没有使用到下标,就使用foreach

需求:声明5个int值的数组,求最大值

注意:int是基本数据类型

          int[]是引用数据类型(说白了,只要是数组都是引用数据类型)

		int[] is = {45,23,18,81,66};
		//假设第0个下标的位置是最大值
		int max = is[0];
		for(int i = 1;i<is.length;i++){
			if(max < is[i]){
				max = is[i];
			}
		}
		System.out.println("最大值为:" + max);
		
		//ArrayIndexOutOfBoundsException - 数组下标越界异常
		//System.out.println(is[1000]);

动态初始化

数组的初始化:

                        静态初始化:由程序员指定数据,系统自动分配空间

                        动态初始化:由程序员指定长度,系统自动分配数据

默认值:         整数类型:0

                        浮点类型:0.0

                        字符类型:'  '

                        布尔类型:false

                        引用类型:null(空)

静态初始化 vs 动态初始化:

                        一开始就知道数据,就使用静态初始化

                        一开始只知道长度,就使用动态初始化

动态初始化1:

		String[] names = new String[5];//开辟5个连续的空间,用于存放元素

动态初始化2:先声明,再初始化

        String[] names;
        names = new String[5];//开辟5个连续的空间,用于存放元素

通过下标设置元素:

		names[0] = "小张1";
		names[1] = "小张2";
		names[2] = "小张3";
		names[3] = "小张4";
		names[4] = "小张5";

数组的排序 -- 冒泡排序

口诀: N个数字来排序

            两两相比小靠前

            外层循环N-1

            内层循环N-1-i

		int[] is = {81,56,42,18,23};	
		//冒泡排序
		for(int i = 0;i<is.length-1;i++){
			for(int j = 0;j<is.length-1-i;j++){
				if(is[j]>is[j+1]){
					int temp = is[j];
					is[j] = is[j+1];
					is[j+1] = temp;
				}
			}
		}

数组的查找

        顺序查找

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

        二分法查找

思路:先排序,再将数组一分为二的循环查找

		int[] is = {81,56,42,18,23};
		//排序 18,23,42,56,81
		Arrays.sort(is);
		int num = 81;//要查找的数据		
		int start = 0;
		int end = is.length-1;		
		while(start <= end){
			int mid = (start+end)/2;			
			if(num > is[mid]){
				start = mid+1;
			}else if(num < is[mid]){
				end = mid-1;
			}else{
				System.out.println("找到元素了,下标为:" + mid);
				break;
			}
		}

数组的复制

        数组的复制1

缺点:改动原数组,新数组中的数据会随之改变

		//原数组
		String[] names = {"小张1","小张2","小张3","小张4"};
		//新数组
		String[] newNames = names;
		//改变原数组的数据
		names[2] = "牛牛";

        数组的复制2

		//原数组
		String[] names = {"小张1","小张2","小张3","小张4"};
		//新数组
		String[] newNames = new String[names.length];
		//遍历原数组,将原数组中的元素复制到新数组中
		for(int i = 0;i<names.length;i++){
			newNames[i] = names[i];
		}
		//改变原数组的数据
		names[2] = "牛牛";

数组的扩容

		//原数组
		String[] names = {"小张1","小张2","小张3","小张4"};
		//计算新长度
		int oldCapacity = names.length;
		int newCapacity = oldCapacity + (oldCapacity>>1);
		//新数组
		String[] newNames = new String[newCapacity];
		//将原数组中的元素复制到新数组中
		for(int i = 0;i<names.length;i++){
			newNames[i] = names[i];
		}
		//将新数组的引用赋值给原数组
		names = newNames;

数组的删除

        数组的删除1

缺点:数组是存放数据的容器,以这种方式去删除数据,会让容器越来越小

		//原数组
		String[] names = {"小张1","小张2","小张3","小张4"};
		//新数组
		String[] newNames = new String[names.length-1];
		//将原数组的元素(除了"小张2")复制到新数组中
		int index = 0;
		for(String element : names){
			if(!element.equals("小张2")){
				newNames[index++] = element;
			}
		}
		//将新数组的地址赋值给原数组
		names = newNames;

        数组的删除2

		//原数组
		String[] names = {"小张1","小张2","小张3","小张4"};
		//数据的迁移
		for(int i = 1;i<names.length-1;i++){
			names[i] = names[i+1];
		}
		names[names.length-1] = null;

数组作为方法的参数和返回值

需求:设计一个方法,传入int类型的数组,返回最大值和最小值

	public static void main(String[] args){
		int[] is = {81,56,42,18,23};
		int[] maxAndMin = getMaxAndMin(is);
		System.out.println("最大值:" + maxAndMin[0]);
		System.out.println("最小值:" + maxAndMin[1]);
	
    public static int[] getMaxAndMin(int[] is){	
		int max = is[0];//假设下标为0的位置的元素为最大值
		int min = is[0];//假设下标为0的位置的元素为最小值		
		for(int i = 1;i<is.length;i++){
			if(max < is[i]){
				max = is[i];
			}
			if(min > is[i]){
				min = is[i];
			}
		}
		return new int[]{max,min};
	}

可变参数

需求:设计一个方法,传入15个int值,求和

public static void main(String[] args){
		//传入的数据作为元素压入到数组中
		int sum = add(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15);
		
		System.out.println(sum);
	}
	//int... is可变参数,本质意义上就是数组
	public static int add(int... is){
		int sum = 0;
		for(int num : is){
			sum += num;
		}
		return sum;

注意:可变参数后面不允许声明其他参数

main方法的参数理解:

        javac Test11.java ​

        java Test11 小红 小绿 小黑 -- 将小红、小绿、小黑作为参数传入到main中

	public static void main(String[] args){
        for(String str : args){
            System.out.println(str);
	}
}

二维数组

概念:二维数组中包含了多个一维数组

数组的声明:数据类型 [] []数组名;

注意:

        1.数组是引用数据类型

        2.数组中的数据,叫做元素

        3.每个元素都是编号,叫做下标/索引

        4.索引从0开始

        5.数组在内存中开辟的空间是连续的

        6.数组一旦初始化后,长度不可改变(意味着数组不可以添加和删除)

静态初始化

静态初始化:由程序员指定数据,系统自动分配空间

静态初始化1

        String[][] names = new String[][]{{"小张1","小张2","小张3"},{"小张4","小张5","小张5,"小张6"}};

静态初始化2:先声明,再初始

    String[][] names;
	names = new String[][]{{"小张1","小张2","小张3"},{"小张4","小张5","小张5,"小张6"}};;

静态初始化3:

    String[][] names = {{"小张1","小张2","小张3"},{"小张4","小张5","小张5,"小张6"}};;

 设置指定下标上的元素:

	names[1][1] = "牛牛";

获取指定下标上的元素

	String str = names[1][1];

获取长度

	System.out.println("获取二维数组中一维数组的个数:" + names.length);//2
	System.out.println("获取二维数组中第一个一维数组元素的个数:" + names[0].length);//3
	System.out.println("获取二维数组中第二个一维数组元素的个数:" + names[1].length);//4

 遍历思路:循环获取二维数组中的一维数组,再循环遍历一维数组中的元素

遍历1:for循环

    for (int i = 0; i < names.length; i++) {
        for (int j = 0; j < names[i].length; j++) {
			System.out.println(names[i][j]);
		}
	}

遍历2:foreach循环

	for (String[] ss : names) {
		for (String element : ss) {
			System.out.println(element);
		}
	}

动态初始化

动态初始化:由程序员指定长度,系统自动分配数据

数组的初始化默认值:

                 整数类型:0

                浮点类型:0.0

                字符类型:'  '

                布尔类型:false

                引用类型:null

动态初始化1

	String[][] names = new String[2][3];//创建二维数组,其中有两个一维数组,每个一维数组中有3个元素

动态初始化2:先声明,再初始化

	String[][] names;
	names = new String[2][3];//创建二维数组,其中有两个一维数组,每个一维数组中有3个元素

设置指定下标上的元素

	names[0][0] = "小张1";
	names[0][1] = "小张2";
	names[0][2] = "小张3";
	names[1][0] = "小张4";
	names[1][1] = "小张5";
	names[1][2] = "小张6";

获取指定下标上的元素

	String str = names[1][1];

 获取长度

	System.out.println("获取二维数组中一维数组的个数:" + names.length);//2
	System.out.println("获取二维数组中第一个一维数组元素的个数:" + names[0].length);//3
	System.out.println("获取二维数组中第二个一维数组元素的个数:" + names[1].length);//3

遍历思路:循环获取二维数组中的一维数组,再循环遍历一维数组中的元素

遍历:for循环

	for (int i = 0; i < names.length; i++) {
		for (int j = 0; j < names[i].length; j++) {
			System.out.println(names[i][j]);
		}
	}

遍历:foreach循环

	for (String[] ss : names) {
		for (String element : ss) {
			System.out.println(element);
		}
	}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值