当前位置:   article > 正文

Java_day_04_方法、递归、内存分析_java中递归内存分析

java中递归内存分析

1 定义方法(入参,出参)

  1. package _01_Method;
  2. /**
  3. * 根据需求 定义方法
  4. 1 入参: 做这件事 需要的未知条件
  5. 2 出参: 做完这件事之后进行的反馈
  6. *
  7. * @author 16200
  8. *2021年12月31日上午10:14:14
  9. */
  10. public class Method_03 {
  11. public static void main(String[] args) {
  12. int Sum = sum(1,2);
  13. System.out.println(Sum);
  14. }
  15. //1 需求 : 向控制台打印1-10
  16. public static void print_01(){
  17. for (int i = 1;i < 11; i++){
  18. System.out.println(i);
  19. }
  20. }
  21. //2 需求: 向控制台打印1-N的值
  22. //参数列表中的变量是局部变量
  23. public static void print_01(int n){
  24. for (int i = 1;i <=n; i++){
  25. System.out.println(i);
  26. }
  27. }
  28. //3 需求 : 计算a+b的值
  29. public static int sum(int n,int m){
  30. int sum = n + m;
  31. return sum;
  32. }
  33. }

2 方法重载

  1. package _01_Method;
  2. /**
  3. * 方法重载
  4. *
  5. 方法唯一性:
  6. 方法名 和 参数
  7. 方法重载(overload): 方法名相同,参数列表不同
  8. 列表不同分为: 个数不同和类型不同
  9. 优势:方便记忆,编码好看
  10. 不是方法复用
  11. *
  12. * @author 16200
  13. *2021年12月31日上午10:26:01
  14. */
  15. public class Method_04 {
  16. public static void main(String[] args) {
  17. }
  18. //计算n+m的值
  19. //相同功能同名,但类型不同即可,即为方法重载
  20. //同名但不是同一个方法
  21. public static int sum(int n,int m){
  22. int sum = n + m;
  23. return sum;
  24. }
  25. public static double sum(double n,double m){
  26. double sum = n + m;
  27. return sum;
  28. }
  29. public static long sum (long n,long m){
  30. long sum = n + m;
  31. return sum;
  32. }
  33. }

 3 方法内存划分:

Java Runtime Data Aare :Java运行时 区域, 一般叫JVM内存

  1. package _01_Method;
  2. /**
  3. * 方法内存划分:
  4. Java Runtime Data Aare :Java运行时 区域, 一般叫JVM内存
  5. 程序计数器:
  6. 一块较小的内存区域,可以看作是当前程序执行的位置指示器
  7. 静态区/方法区:
  8. 保存程序文件(class文件) 以及静态数据,方法被调用之前,也保存才静态区,内部还有运行时常量池
  9. VM栈: 又叫栈内存
  10. 栈内存是一站数据解雇为模型开辟的一段空间,特性是先进后出
  11. 栈: 是一种数据结构,先进后出
  12. 栈的构成因素
  13. 栈空间: 栈内存就是栈空间
  14. 栈帧:栈空间里的每一个栈元素
  15. 栈底元素: 第一个放进去的栈帧
  16. 栈顶元素: 最后一个放进去的栈帧
  17. 栈操作
  18. 压栈: 把元素放入栈空间的过程
  19. 弹栈: 把元素弹出的过程
  20. 栈内存:
  21. 是用来执行方法的, 所有得方法的执行,必须在栈内执行
  22. 本地方法栈:
  23. 用来执行一些本地方法,比如hashCoad等,模型和操作都和VM栈一致,不用管
  24. 堆内存:
  25. 用来保存对象
  26. 1 java程序编写
  27. 2 javac编译得到class文件
  28. 3 Java命令 运行
  29. 3.1 开启jvm,把运行的程序载入内存,把class文件保存到静态区
  30. 3,2 加载完之后,JVM自动调用程序中的main方法
  31. 3.3 在栈内存开辟栈帧,用来执行main方法
  32. 如果 main 方法中,没有其他方法调用,则运行完 弹栈 销毁 结束 JVM关闭
  33. 如果 main 方法中,有其他方法调用,则在main方法之上再开辟栈帧,用来执行相应 方法
  34. 如果调用的方法是其他类的方法,则需要吧对应的类先加载进来
  35. 方法调用: 就等于是压栈操作
  36. 方法执行完成: 就等于弹栈操作
  37. 加载
  38. 静态加载 : 值程序开始运行 , 就把相关的所有文件全部一次性载入内存
  39. 动态加载: 程序运行开始,只载入核心文件,当用到其他文件的时候,再去加载
  40. java中采用动态加载机制
  41. * @author 16200
  42. *2021年12月31日上午10:37:54
  43. */
  44. public class Method_05 {
  45. public static void main(String[] args) {
  46. System.out.println(0);
  47. }
  48. public static void test(){
  49. test2();
  50. System.out.println(1);
  51. }
  52. public static void test2(){
  53. System.out.println(2);
  54. }
  55. }

4 递归

  1. package _02_Recursion;
  2. /**
  3. 递归:方法中调用当前方法
  4. 递归思想
  5. 递归和迭代是等价的,就是循环
  6. 基本思想就是以此类推
  7. 应用场景:
  8. 循环能做的,递归都能做,但是这种情况 优先使用循环,因为递归非常消耗内存,运行效率低
  9. 但是 像树状结构之类的,循环是没法做的,只能通过递归
  10. 常见的问题
  11. 所有树状结构
  12. 文件夹复制
  13. 斐波那契数列
  14. 难点: 不容易理解,递归思想
  15. 解决方法:画图,栈帧调用图
  16. 注意 :必须要有终止条件,否则就等于死循环一样 ,导致一直压栈不会弹栈而出现 栈内存溢出问题
  17. *
  18. * @author 16200
  19. *2021年12月31日上午11:33:43
  20. */
  21. public class Recursion_01 {
  22. //未设置终止条件,栈内存溢出
  23. // public static void main(String[] args) {
  24. // test();
  25. // }
  26. // public static void test(){
  27. // test();
  28. // System.out.println(1);
  29. // }
  30. public static void main(String[] args) {
  31. int q = sum1(5);
  32. System.out.println(q);
  33. }
  34. public static int sum(int n){
  35. int sum = 0;
  36. for (int i=1; i<= n;i++){
  37. sum+=i;
  38. }
  39. return sum;
  40. }
  41. public static int sum1(int n){
  42. if (n == 1){
  43. return 1;
  44. }else{
  45. return n + sum (n - 1);
  46. }
  47. }
  48. }

4.1 斐波那契数列

  1. package _02_Recursion;
  2. /**
  3. * 斐波拉契数列
  4. *
  5. * 1 1 2 3 5 8 13 21 34 55 89.....
  6. *
  7. * 计算第n位数是多少
  8. *
  9. * @author 16200
  10. *2021年12月31日上午11:50:35
  11. */
  12. public class Recursion_02 {
  13. public static void main(String[] args) {
  14. int result = factorial(5);//如果数太大,这会导致栈满报错
  15. System.out.println(result);
  16. System.out.println(count);
  17. }
  18. static int count=0;
  19. public static int factorial(int n ){
  20. count++;
  21. if(n == 1| n== 2 ){
  22. return 1 ;
  23. }else{
  24. return factorial(n-1)+factorial(n-2);
  25. }
  26. }
  27. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/116130
推荐阅读
相关标签
  

闽ICP备14008679号