2021-7-17 Java课堂笔记Day3

1.数组

1.1定义

相同类型数据的有序集合,按一定顺序排列组合,其中每一个数据称为元素,每个元素可通过数组的索引或下表定位。

1.2特点

1.数组本身是引用类型数据,而元素可以为任意类型(基本类型/引用类型)

2.创建数组会在内存中开辟一块空间,空间是连续的。数组名中的引用时连续空间的首地址

3.数组长度一旦确定不能修改

4.储存数据类型必须相同,不能出现混合类型。

1.3分类

维度:一维数组、二维数组、三维数组、多维数组……

数据类型:基本类型(整形、浮点型、字符型、布尔型)、引用类型

1.3.1一维数组

1.定义格式

格式一: 数据类型 【】 变量名 (数组名) (常用)

格式二: 数据类型 变量名 【】

2.初始化

java中数组必须先初始化(为数组中元素分配空间并赋值)后才能使用

方式一 静态初始化: 数据类型 【】 变量名 = new 数据类型 【】{数据1,数据2,……}

数据类型 【】 变量名 ={数据1、数据2、……}(简化)

(数组声明和元素空间分配及赋值一次进行,可不用声明数组长度)

方式二 动态初始化: 数据类型 【】 变量名 = new 数据类型【数组长度】

(数组声明和元素的分配空间及赋值分开进行)

初始化形式 变量名 【索引】= 变量值

索引即为数组中的空间地址,值为0~(数组长度-1)

3.默认值

数组元素即使没有赋值也会有默认值

byte、short、int类型默认值为0 long类型默认值为0L

float、double类型默认值为0.0 char类型默认值为”\u0000“(空白)

boolean类型默认值为false String类型默认值为null

4.数组长度

可由输出数组属性 数组名.length 获取

当数组索引超过数组长度时,会发生报错 “ArrayIndexOutOfBoundsException”(数组下标越界异常)

5.内存管理

程序向JVM申请内存 —> JVM向操作系统申请内存

内存是计算机中的重要组件,程序必须要申请内存才能执行,且执行结束后需要清空内存

JVM要运行程序,必须对内存进行空间分配

5.1 java中的内存分配

程序计数器 :CPU记录文件运行到何处

本地方法栈:JVM调用操作系统的功能使用

方法区:储存class文件

堆区:储存申请了内存空间(new)的对象或数组,如果申请不到内存则会抛出“”内存溢出异常

虚拟机栈:存放“栈帧”,栈帧中存放对基本类型数据变量和对象的引用、操作数栈、方法出口以及其他信息,每个栈帧对应一次方法的调用。当栈调用的深度大于JVM允许范围时会发生异常。

5.2一维数组内存结构

main方法运行,数组存入栈内存,数组数据存入堆内存,通过栈帧可由数组调用数组中的数据

6.数组使用注意事项

1.“ArrayIndexOutOfBoundsException”数组下标越界异常

说明数组索引大于数组长度

解决方案:修改数组索引,使其小于数组长度

2.“NullPointerException”空指针异常

说明引用类型的变量不指向任何对象(没有引用到数据)

解决方案:给引用类型的变量一个真正的堆内存空间引用

7.数组常见操作

遍历 获取数组中的每一个元素

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

增强for循环(jdk1.5新增):专门用于遍历

for(int a:arr){
    System.out.println(a);
}

增强for循环 遍历时更简洁

普通for循环 可通过索引精确控制每一个元素,增强for循环不行

拷贝 用于数组扩容

普通拷贝

  public static void main(String[] args) {
        int[] arrSrc = {2,3,52,11,4,5,43,2,1};
        int[] arrDest = new int[arrSrc.length];// 新数组的长度 必须大于等于原数组
         for(int i = 0 ; i < arrDest.length;i++){
             arrDest[i] = arrSrc[i];
         }
         for(int a : arrDest){
             System.out.println(a);
         }
    }

无限扩容

 public static void main(String[] args) {
        int[] arrSrc = new int[5];
        int[] arrNew=null;
        int count=0;
        for(int i = 0 ; i< 100;i++ ){
            if(count < arrSrc.length){//当数组中的元素的个数小于数组的长度 则可以保存数据到数组中
                arrSrc[i]=i;//给数组添加元素
            }else{//数组中的数据的个数大于等于了数组的长度
                arrNew = new int[arrSrc.length +(int)(arrSrc.length * 0.75)];
                for (int j = 0 ; j < arrSrc.length;j++){
                    arrNew[j]= arrSrc[j];
                }
                arrSrc = arrNew;
                arrSrc[i]=i;//给数组添加元素
            }
            count++;//统计数组中数据的个数
        }
     //遍历
        for(int a : arrNew){
            System.out.println(a);
        }
​
    }

最值 获取数组中的最大最小值

记录元素的值进行输出

    public static void main(String[] args) {
        int[] arr = {2,52,26,22,12,3,223,22,91,81};
        // 获取数组中的最大元素
        int max = arr[0];//假设第一个元素是最大的
        for(int a : arr){
            if(a > max){
                max = a;
            }
        }
        System.out.println(max);
    }

记录元素的位置进行输出

    public static void main(String[] args) {
        int[] arr = {2,52,26,22,12,3,223,22,91,81};
        // 获取数组中的最大元素
        int maxIndex=0;
        for(int i = 0 ; i < arr.length;i++){
            if(arr[i] > arr[maxIndex]){
                maxIndex = i;
            }
        }
        System.out.println(arr[maxIndex]);
    }

1.3.2二维数组

1.初始化

动态初始化:

int [][] arr = new int [3][5];//三行五列二维数组
arr [0][0] = 12; //赋值
arr [0][1] = 34;
int [][] arr = new int [3][]
arr[0] = new int [3];
arr[1] = new int [4];
arr[2] = new int [5];

二维数组初始化必须定义行(第一个数组),可不定义列(第二个数组)

静态初始化:

int [][] = int[][] arr = {{2,1,4},{3,1,4,2,1},{3}};
int[][] arr =new int[][]{{2,1,4},{3,1,4,2,1},{3}};

2.二维数组内存结构

与一维数组类似,不同在于堆内存中存放了数组1和数组2的数据,数组2数据由数组1调用,数组1数据由数组2调用

2.方法

方法:将具有独立功能的代码库组织成为一个整体,使其具有特殊功能的代码集。

注意: 方法必须先创建才可以使用,过程就成为方法的定义。方法定义之后不能直接运行 需要手动的调用 才可以执行。过程称为方法的调用。

2.1无参方法的定义和调用

定义:

public static  void 方法名称(){
    方法体;
}

调用方法: 方法名称();

调用过程:

main方法入栈后,执行main方法中的代码,执行到方法代码时,方法入栈,执行方法代码,执行完毕后方法出栈并清除方法内存,继续执行main方法代码,最后main方法出栈。

2.2带参方法的定义和调用

定义:

public  static  void  方法名称(参数类型  参数名称,参数类型  参数名称,…………)

调用:

方法名称(参数1,参数2,参数3,…………)(参数的数量和类型必须与方法定义的一致)

形参:方法定义式中的参数。

实参:方法调用时使用的参数。

形参和实参的功能是传递数据,发生方法调用时,实参的值会传递给形参。

2.3形参和实参的区别

1.形参只在方法内部有效,在方法外部无效。

2.实参可以是任意类型数据,但调用时一定要有确定的值。

3.形参和实参在数量、类型、顺序上都必须严格一致。(能够自动类型转换的除外)

4.方法调用时,数据的传递时单向的,即只有实参能传递给形参,且形参的值的改变不会影响实参。参数传递完成后实参和形参将不会有任何关系。

2.4带返回值方法的定义和调用

定义:

public static 返回值类型 方法名称(参列表){
    方法体;
    return 数据;(数据类型和返回值类型必须一致)
}

调用:方法名称(参数列表)

注意:return后不执行之后的语句 当返回值类型为void是也可写return,形式为 retrun;

2.5方法的注意事项

1.方法不能嵌套定义,方法之间为平行关系,方法只能调用方法

2.void表示无返回值,可省略return,也可单独属性,后面不跟任何数据

3.方法必须被调用才会执行

2.6方法的参数传递

值传递:传递的是数据本身(参考2.3形参和实参的区别)

引用传递:传递的是地址(引用),所以引用的只要是同一个地址空间,任何地方对空间的修改都会引起整个的变化

2.7方法的重载

方法重载条件:1.形参个数不同 2.参数类型不同 3.不同类型参数顺序不同

注意:方法的返回值类型不能作为方法是否重载的判断依据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值