🌀🌀🌀作者:@小鱼不会骑车
🍁🍁🍁专栏:《java练级之旅》
🎀🎀🎀个人简介:一名专科大一在读的小比特,努力学习编程是我唯一的出路😎😎😎
🙈🙈🙈作者心里话![]()
《java练级之路之数组的应用场景》非常细致,小白也能看懂!!!
小鱼一直都是秉承着“开开心心看博客,快快乐乐学知识”这个观点来给大家用一些接地气的话进行讲解,可能会有人觉得小鱼太墨迹了,小鱼这里也很乐意接受大家的意见,会进行采纳,大家也可以指出小鱼的不足,小鱼也会积极的进行改变,总之,愿我们越来越优秀
前言
😎 emmm,这篇是关于java中《初识数组》的,关于前两章大家可以去我主页查看,当然我也会给这三篇文章单独分一类以便于大家更好的观看,我们经过了前两章有些枯燥的理论知识后是不是各位也都想上手实战一下,好的!我们这篇文章就是带大家巩固知识,不过你们应该懂小鱼吧,那必须会留下一些坑啊(大家可不要跳进坑里呦),在此基础还是会掺杂一些理论知识的,不过小鱼尽量找个大家更容易理解的方式进行讲解,好的废话不多说,我们进入正题
介绍
来让小鱼给大家介绍一些今天的任务,
- 任务1️⃣:保存数据(特别简单可以跳过)
- 任务2️⃣:作为函数的参数
- 任务3️⃣:作为函数的返回值
- 任务4️⃣:数组练习(大家期待已久的!!!)
我们的任务规划好了,现在开始
(💫数组的应用场景)
😺1. 保存数据
public static void main(String[] args) {
int[]array={1,2,3};
for (int i = 0; i <array.length ; i++) {
System.out.print(array[i]+" ");
}
}
将数组的值打印出来,简称保存数据
😸2. 作为函数的参数
🍒 前言
大家应该很熟悉吧,咱们的阿七,当然,咱们的重点不是这个,理发店大家是不是都很常见,也有一句特别有意思的话,当然小鱼也是亲身经历的,我以为剪了头发,就可以了无牵挂,相信大家都是耳熟能详吧。不过我们先奔入正题,我们在理发时,一般就会有理发师A给你理发,但是理发之前呢,会先去洗头,这个时候就是理发师B的任务了,也就是理发师B和理发师A都可以对你进行改变(两种情况),
情况一这时候吧又有一个人特别着急,于是便让这个理发师B先给他洗了头,那么你呢,就只是干坐着,什么都没变,后来理发师A就又把你从理发师B的手里接了回来,你现在就是什么都没有改变的状态,
情况二就是理发师B给你把头洗了,等到理发师A再把你接回来的时候,你就是已经变化了的状态(头洗了和没洗是两种状态),
注意!!!先说明,理发师A和理发师B能做的事情都是一样的。
可能大家听这个会感觉一些疑惑,咦,这都什么是什么啊,小鱼想说,大家别急,等会咱们跟进着问题,疑惑也就渐渐的消散了。
🍒 题目一
public static void fun(int x) {
x=20;
System.out.println("x="+x);
}
public static void main(String[] args) {
int a=10;
fun(a);
System.out.println("a="+a);
}
// 执行结果
//a = 10
//x = 20
我给大家画图解释一下
1️⃣大家看,我们的x最开始接受的值是10,并且在栈上给fun方法开辟了一个空间,该空间存储的是f方法内部的变量。
🔔这里涉及到了形参和实参,形参是实参的临时拷贝,改变形参不会影响实参,大家就可以认为,x是形参,a是实参,我们把实参a的值传递到形参x,这样我们的x变量里面存的值就是整形10.
2️⃣接下来我们修改我们的x,将x赋值为20,前面讲到了,形参是实参的一个临时拷贝,他的改变不会影响实参,所以我们就可以得到,虽然我们的x改成了20,但是我们的a依旧是10,
大家看箭头指向的地方,我们的x被修改成20了,但是我们的a依旧没变。这个就是基本数据类型传参
🍒 题目二
注意下面的才是重点❗️❗️❗️
public static void fun1(int[]array) {
array=new int[]{1,2,3};
}
public static void fun2(int[]array) {
array[0]=100;
}
public static void main(String[] args) {
int[]array1={1,2,3,4};
fun1(array1);我们先进行fun1这个方法
//fun2(array1);
System.out.println(Arrays.toString(array1));
}
💡这里就涉及到了之前讲到的剪头发问题了,
🌲fun1方法
大家认为我们经过了fun1方法之后打印的会是什么?
大家思考一下
想必大家都会有一些疑惑吧,怎么就没有改变呢?
💡小鱼给大家进行细致讲解
老规矩,画图演示
1️⃣在这里呢,我们进入了fun方法中,在fun方法内创建了一个变量array,这时候呢,因为我们的array1是array的一份临时拷贝,所以我们的array存放的值也是在堆中给数组开辟的内存的地址。我们可以通过这两个变量都去找到这个地址,
🔔这时候呢,就涉及到咱们讲到的理发的问题了,两个理发师都可以对这个人进行改变,
2️⃣但是呢我们的理发师2(array)没有对这个客户负责,他去给别的人洗剪吹去了,就如下图
那么这个时候我们的理发师2还能对这个客户进行改变嘛?不能了,你都去服务别的客人了,还怎么对我进行改造啊,所以我们就可以结合实际,推导出我们的array1对应的那块数组没有被进行改变,所以呢我们最后的打印,也就是原数组{1,2,3,4}
🌲fun2方法
public static void fun1(int[]array) {
array=new int[]{1,2,3};
}
public static void fun2(int[]array) {
array[0]=100;
}
public static void main(String[] args) {
int[]array1={1,2,3,4};
// fun1(array1);
fun2(array1);//这次对fun2进行解答
System.out.println(Arrays.toString(array1));
}
还是老规矩,大家思考一下我们的array1最终会输出什么呢❓
各位猜对了吗?
接下来小鱼再给大家细致的讲解这个题
1️⃣我们大家来看第一步
依旧是先进行拷贝,将我们的array1变量中保存的地址拷贝给了array
这时候大概意思就是,我们的理发师1和理发师2都可以对这个人进行改变,
2️⃣我们的理发师2这次没有别的事情了,专心的给客户洗了头,对吧,等到我们的理发师1(array1)再去接收到这个客户时,也就是被洗完了头的客户,结合实际,大家看我们的图,array其实就像是理发师2,对数组进行了修改,因为他们存的地址都一样,都可以通过这个地址来找到这块在堆上开辟的数组,就这样我们的数组被修改了,那么我们的最后打印的也自然就是被修改后的数{100,2,3,4}
所以我们发现
发现在func方法内部修改数组的内容, 方法外部的数组内容也发生改变.
因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。
✅总结
所谓的 "引用" 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实
只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).
😺3.作为方法的返回值
🔎可能有人知道我们在C语言中创建的函数是可以有返回值的,根据要返回值的类型,来决定返回的类型
获取斐波那契的前N项
public static int[] Fib(int n) {
if(n <= 0){
return null;
}
int []array=new int[n];
array[0]=1;
array[1]=1;
for (int i = 2; i <n ; i++) {
array[i]=array[i-1]+array[i-2];
}
return array;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt();
int[]array= Fib(a);
System.out.println(Arrays.toString(array));
}
public static int[] fun3() {
int[]p=new int[]{1,2,3,4};
return p;
}
public static void main(String[] args) {
int[]array1=fun3();
System.out.println(Arrays.toString(array1));//打印
}