JavaStudy05 数组

20200313 加快进度!

今天内容和教学目标

在这里插入图片描述

一、数组(array)

1.1概念

相当于一个容器,同时存放多个数据(vs变量只能存放一个数据)

1.2特点 3

  • 是一种引用数据类型(vs基本数据类型)
  • 数据类型必须统一
  • 数组的长度在程序运行期间不可改变

1.3数组的初始化

定义:在内存中创建一个数组,并且向其中赋予一些默认值
方式(2):
1.动态初始化(指定长度)
基本/标准格式:数据类型[] 数组名称 = new 数据类型[数组长度];
> 如:int[] arrayA = new int[5]
> 解析含义

可拆分成
int[] arrayA;
arrayA = new int[5];

使用建议:不确定具体内容时
2.静态初始化(指定内容)
基本/标准格式:数据类型[] 数组名称 = new 数据类型[]{5,15,25};
>如:int[] arrayA = new int[]{2,3,4}
>自动计算长度

可拆分成
int[] arrayA;
arrayA = new[]{2,3,4};

省略格式:数据类型[] 数组名称 = {5,15,25};

省略格式不可拆分

/*int[] arrayA;
arrayA = {2,3,4};*/

使用建议:确定具体内容时

1.4数组的访问

直接打印数组名称,得到的是数组对应的,内存哈希值 16进制
访问数组元素的格式:数组名称[索引值];
注意:索引值从0开始,一直到“数组的长度-1”为止。
可以直接打印也可赋值给变量

//静态初始化数组访问
public class Demo03Array {
    public static void main(String[] args) {
        //静态数组省略格式 2,4,5
        int[] arrayA  = {2,4,5};
        System.out.println(arrayA);//[I@5f150435

        //直接打印数组中的元素
        System.out.println(arrayA[0]);//2
        System.out.println(arrayA[1]);//4
        System.out.println(arrayA[2]);//5
        System.out.println("==========");
        
        //赋值单个数据给变量
        int num = arrayA[0];
        System.out.println(num);
    }
}
package cn.itcast.day05;
//动态初始化数组访问
/*使用动态初始化数组时,元素自动拥有一个默认值
整数类型为0
浮点类型为0.0
字符类型为'\u000'(为不可见字符,并非为空格)
布尔类型为false
引用类型为null

注意:静态初始化数组也会自动拥有一个默认值,不过之后被替换
 */
public class Demo04Array {
    public static void main(String[] args) {
        int[] array = new int[3];
        System.out.println(array);//内存地址值
        System.out.println(array[0]);//0
        System.out.println(array[1]);//0
        System.out.println(array[2]);//0
        System.out.println("==========");
        
        //将数据324赋值给array中的1号元素
        array[1]=324;
        System.out.println(array[0]);//0
        System.out.println(array[1]);//324
        System.out.println(array[2]);//0
    }
}

二、数组原理内存图

2.1Java中的内存划分(5)

  1. 栈(Stack):方法的运行一定要在栈中
  2. 堆(Heap):凡是new出来的东西,都在堆中

    堆内存里面的东西都有一个地址值:16进制
    堆内的数据都有默认值:
    整数 0
    浮点数 0.0
    字符 ‘\u000’
    布尔 false
    引用类型 null

  3. 方法区(Method Area):存储.class相关信息,包含方法的信息
  4. 本地方法栈(Native Method Stack):与操作系统相关
  5. 寄存器(pc Register):与CPU相关
    在这里插入图片描述

2.2数组的内存图

一个数组的内存图
在这里插入图片描述
两个数组的内存图
在这里插入图片描述
数组间赋值的内存图
在这里插入图片描述

三、数组的常见操作

3.1 数组索引越界异常

package cn.itcast.day05.Demo03;
/*索引编号并不存在即发生 数组索引越界异常
ArrayIndexOutOfBoundsException
*/
public class Demo01ArrayIndex {
    public static void main(String[] args) {
        int[] array= {1,3,4};
        System.out.println(array[0]);
        System.out.println(array[1]);
        System.out.println(array[2]);
        
        //错误写法,并不存在
//        System.out.println(array[3]);
    }
}

3.2空指针异常

在这里插入图片描述

3.3获取数组的长度

格式:
数组名称.length
数组一旦创建,程序运行期间,长度不可改变

3.4遍历数组

package cn.itcast.day05.Demo03;
//遍历打印数组数据
public class Demo04Array {
    public static void main(String[] args) {
        int[] arrayA = {2,4,45,6,7,8,8,5,6};
        //方法一,一次打印
        System.out.println(arrayA[0]);
        System.out.println(arrayA[1]);
        System.out.println(arrayA[2]);
        System.out.println(arrayA[3]);
        System.out.println(arrayA[4]);
        System.out.println(arrayA[5]);
        System.out.println(arrayA[6]);
        System.out.println("===========");

        //方法二,自定义次数,循环
        for (int i = 0; i < 6; i++) {
            System.out.println(arrayA[i]);
        }
        //法三,赋值length,循环
        int length = arrayA.length;
        for (int i = 0; i < length; i++) {
            System.out.println(arrayA[i]);
        }
        //法四,len次数 循环
        for (int i = 0; i < arrayA.length; i++) {
            System.out.println(arrayA[i]);
        }

    }
}

快捷写法 数组名.fori = for(int i=0;i<arrayA.length; i++) { }

3.5习题:获取数组中的最大值

package cn.itcast.day05.Demo03;
//获取数组中的最大值,{2,5,3,5,6},依次比较留下较大值再与下一个比,比length-1次,0先赋值给max
public class Test01ArrayMax {
    public static void main(String[] args) {
        int[] array = {2,5,3,5,6};
        int max = array[0];
        for(int i=1;i<array.length;i++){
           max= (array[i]>max?array[i]:max);
        }
        System.out.println(max);
    }
}

3.6数组元素的反转

不能使用新数组,思路如图
在这里插入图片描述

package cn.itcast.day05.Demo03;
public class Text02ArrayReverse {
    public static void main(String[] args) {
//数组反转,不用新数组,array[i]=array[length-i-1] 01234 43210,算法错误
        /*int[] array = {2,4,6,2,5};
        int j=array.length-1;
        for (int i = 0; i < array.length; i++) {
            array[i]=array[j-i];
            System.out.println(array[i]);
        }*/

        //对称时交换minmax索引值,什么时候停下min>=max,什么时候交换min<max,循环与输出混乱,算法错误
        /*int[] array = {2,4,6,2,5};
        int min=0;
        int max =array.length;
        int temper;
        for(int i=0;i<max;i++) {
            if (array[min] < array[max]) {
                temper = array[min];
                array[min] = array[max];
                array[max] = temper;
            }
            System.out.println(array[i]);
        }*/
        //先置换再打印,置换用循环,置换怎么循环for(初始化;条件判断;步进){循环体}
        /*初始化:int min=0,max=array.length-1
         条件判断:min<max
         步进:min++,max--
         */
        int[] array = {32,445,65,878,333};
        for(int min=0,max=array.length-1;min<max; min++,max--){
            int temper =array[min];
            array[min]=array[max];
            array[max]=temper;
        }
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
            
        }
    }
}

3.7数组作为方法参数(param)_传递地址

任何数据类型都能作为方法的参数 #记住
数组可以作为方法的参数
当调用方法的时候,向方法的小括号进行传参,传递进去的其实就是数组的地址值。

package cn.itcast.day05.Demo03;
//调用方法传递数组参数
public class Demo05ArrayParam {
    public static void main(String[] args) {
        int[] array={3,5,6,4,3};
        System.out.println(array);//地址值
        printArray(array);//传递进去的是array当中保存的地址值
    }
    /*方法三要素
    返回值:打印,无结果,无参数,void
    方法名:printArray
    参数:需要告诉,数组
    */
    public static void printArray(int[] array){
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);//地址值
        }
    }
}

3.8数组作为方法返回值_返回地址

1.一个方法可以有0/多个参数,但是只能有0/1个返回值。一个方法产生了多个返回数据,就用数组返回。
2.任何数据类型都能作为方法的参数类型或者返回值类型。数组传递和返回的都是数组的地址值。
3.方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.

package cn.itcast.day05.Demo03;
//传参数,返回平均值和总和
public class Demo06ArrayReturn {
    public static void main(String[] args) {
        //相当于直接打印array,输出的为地址
        System.out.println(calculate(2, 3, 5));
        System.out.println("=======");

        int[] result = calculate(2, 3, 5);
        System.out.println("总和为:"+result[0]);
        System.out.println("平均数为:"+result[1]);

    }

    public static int[] calculate(int a, int b, int c) {
        int sum = a + b + c;
        int avg = (a + b + c) / 3;
        int[] array ={sum,avg};
        return array;
    }
}

Bug

https://editor.csdn.net/md/?articleId=104827800

发布了20 篇原创文章 · 获赞 1 · 访问量 483

猜你喜欢

转载自blog.csdn.net/MF507/article/details/104734057