Java从菜鸟到高手②(输入输出,方法,递归,数组)

目录

1.输入输出

1.1输出

1.2.输入

1.3.scan.nextLine()和scan.next()的区别 

2.方法的使用

2.1.方法的定义

2.2.形参和实参的关系

2.3.方法的重载

2.4.方法签名

3.递归

3.1.递归有递和归两个部分组成

4.数组

4.1.数组的定义

4.2.将数组转化为字符串

4.3深入理解int[ ] arr = {1, 2, 3, 4}

4.4.总结

4.5.数组的传参与返回

4.6.数组的销毁

5.二维数组

5.1.二维数组的定义

5.2.深度理解arr[2][3]

5.3.不规则数组


目录

1.输入输出

1.1输出

 1.2.输入

1.3.scan.nextLine()和scan.next()的区别 

2.方法的使用

2.1.方法的定义

2.2.形参和实参的关系

2.3.方法的重载

2.4.方法签名

3.递归

3.1.递归有递和归两个部分组成

4.数组

4.1.数组的定义

4.2.将数组转化为字符串

4.3深入理解int[ ] arr = {1, 2, 3, 4}

4.4.总结

4.5.数组的传参与返回

4.6.数组的销毁

5.二维数组

5.1.二维数组的定义

5.2.深度理解arr[2][3]

5.3.不规则数组


1.输入输出

1.1输出
int a = 10;
String arr = "hello bit";
//输出并换行
System.out.println(a);
System.out.println(arr);
System.out.println(arr + a);
//输出不换行
System.out.print(a);
//格式化输出
System.out.printf("%d\n", a);
1.2.输入
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
double b = scan.nextDouble();
1.3.scan.nextLine()和scan.next()的区别 
Scanner scan = new Scanner(System.in);
String arr1 = scan.nextLine();
String arr = scan.next();

1.scan.next():读取字符串,遇到空格即停

2.scan.nextLine():读取一行字符串,但会读取上一个输入的回车,所以当你输入的数据有很多不同类型的时候,优先去处理字符串的输入,或在使用前加:scan.next();

3.Scanner scan = new Scanner(System.in);
String arr1 = scan.nextLine();

4.Scanner:类型 scan:变量名(任取) = new Scanner(System.in);
String arr1 = scan(已取好的变量名).nextLine();

2.方法的使用

2.1.方法的定义
public static void func(int a) {
        //方法体
}

public static:固定搭配+void:函数返回值+func:函数名(参数列表){函数体

}

2.1.1.方法的命名采用小驼峰,类名采用大驼峰

2.1.2.Java没有方法声明这一说,方法定义在main函数的前面后面都可以

2.2.形参和实参的关系

形参是实参的临时拷贝,形参的改变不会影响实参,Java不能获取栈上的地址

2.3.方法的重载

①:方法名必须一样 ②:参数列表必须不一样(参数个数,参数类型,顺序)③:与返回值无关(若仅返回值不同,编译报错)

好处:不用记那么多的方法名

2.4.方法签名

2.4.1.方法签名即经编译器修改后方法最终的名字,正是因为方法签名,所以在同一个类中可以定义多个方法名相同的方法

2.4.2.方法签名的方法:方法全名路径+参数列表+返回值类型

3.递归

3.1.递归有递和归两个部分组成

3.2.特点:①.每次递的时候这个方法只执行了一部分 ②:归的时候,会把当前方法未执行的部分执行完毕 ③:递的次数和归的次数一样

3.3.如何递归:①.寻找递推公式 ②:找起始条件(终止条件)

4.数组

4.1.数组的定义

数组的三种定义方法:

int[] arr = {1, 2, 3};
int[] arr1 = new int[]{1, 2, 3};//静态初始化
//动态初始化,没有本质上的区别,只有写法上的不同,内存分配位置都为堆区
int[] arr2 = new int[5];//没有赋初始值,Java默认为0
arr2 = new int[]{1, 2, 3, 4, 5};


int[] arr3 = new int[5];
//错误
arr3 = {1, 2, 3, 4, 5};
//正确
arr3 = new int[]{1, 2, 3, 4, 5};

 4.1.1.若数组未初始化时,默认值即为初始值,int类型默认值是0,boolen默认值是false

4.1.2.数组是在堆区保存的 

int a = 10;
double b = 5.2;
int[] arr = {1, 2, 3}

 a,b是基本数据类型定义的变量,因此其空间中保存的就是其初始化的值

arr是引用数据类型定义的变量/数组类型的引用变量,其内部保存的是对象在堆空间中的地址

4.2.将数组转化为字符串
int[] arr = {1, 2, 3, 4};
String array = Arrays.toString(arr);
System.out.println(array);
4.3深入理解int[ ] arr = {1, 2, 3, 4}

int[] arr1 = {1, 2, 3 4};
int[] arr2 = {1, 2, 3, 4, 5};
arr2 = arr1;//此时arr2也指向arr1指向的对象{1,2,3,4}
//{1, 2, 3, 4, 5}没有人指向了,此时就被JVM自动回收了,虽在堆区,但无需手动free

1.一个引用不能同时指向多个对象

2.一个对象可以同时被多个引用指向

3.int[ ] arr = null,代表这个引用不指向任何对象,null在Java中表示空引用,和0号地址没有任何关系

4.若一个数组没有引用变量指向了,此时就被JVM自动回收了,虽在堆区,但无需手动free

4.4.总结

所谓的引用,本质上只是存了一个地址,Java将数组设定为引用类型这样的话后续数组传参只是将数组的地址传入到函数形参中,避免对整个数组的拷贝(若数组较长,拷贝开销大)

4.5.数组的传参与返回

4.5.1.数组的传参

1.Java中,数组传参实际穿的是地址(即数组的引用),通过修改形参可以达到改变实参的效果

public static void fun(int[] arr) {
    arr[0] = 99;//arr = {99, 2, 3}
}
public static void main(String[] args) {
    int[] arr = {1, 2, 3};
    fun(arr);
    System.out.println(Arrays.toString(arr));
}
public static void fun(int[] arr) {
    arr = new int[]{4, 5, 6};
}
public static void main(String[] args) {
    int[] arr = {1, 2, 3};
    fun(arr);
    System.out.println(Arrays.toString(arr));
}

此时,修改形参arr = new int[ ] = {4, 5, 6}并不会修改实参的值,而是相当于在堆区重新开辟了一块空间来保存4,5,6,,并将地址给arr保存

2.Java中数组可以作为返回值,实际返回的是数组在堆区的地址

4.6.数组的销毁

1.在Java中,堆空间的数据是自动销毁的,当没有变量引用对象时,这个对象就会被自动释放

2.堆是随着程序开始时而创建,不一定随着程序的退出而销毁,堆中的数据只要有变量引用,就不会被销毁

5.二维数组

5.1.二维数组的定义
int[][] arr = {{1,2,3},{4,5,6}};
int[][] arr1 = new int[][]{{1,2,3},{4,5,6}};
int[][] arr3;
arr3 = new int[][]{{1,2,3},{4,5,6}};

行:arr.lenth    列:arr[1].lenth
5.2.深度理解arr[2][3]

5.3.不规则数组

不规则的数组:列可以省略,行不能省略

int[][] arr = new int[2][];
arr[0] = new int[3];
arr[1] = new int[4];

//可以指定每一行几个元素
递归是一种编程技术,它允许一个函数调用自身来解决问题。在递归中,函数会不断地调用自身,直到达到一个基本情况(base case),这个基本情况通常是不需要递归调用的最简单情况。在递归输出数组元素的场景中,递归函数会从数组的第一个元素开始,输出该元素,然后递归调用自身来处理数组的下一个元素,直到数组末尾。 以下是用递归方法输出数组元素的基本步骤: 1. 定义一个递归函数,它接受数组以及数组的索引作为参数。 2. 在函数内部,首先检查基本情况,例如索引是否超出了数组的界限。如果是,递归结束。 3. 如果不是基本情况,先执行需要的操作,例如输出当前索引对应的数组元素。 4. 然后递归调用该函数,索引加一,继续处理数组的下一个元素。 递归输出数组元素的伪代码如下: ``` function recursivePrint(array, index) { // 基本情况:索引超出数组长度 if (index >= array.length) { return; } // 输出当前索引的数组元素 print(array[index]); // 递归调用,处理下一个元素 recursivePrint(array, index + 1); } ``` 调用上述函数的示例代码: ``` let myArray = [1, 2, 3, 4, 5]; recursivePrint(myArray, 0); // 输出: 1 2 3 4 5 ``` 递归方法输出数组元素是一种简洁且易于理解的方法,但在处理大型数组时可能会因为调用栈过深而导致栈溢出错误。因此,在实际应用中,需要根据数组的大小和环境的限制谨慎使用递归
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值