<Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配...

简介: <Java SE> 5道递归计算,创建数组,数组遍历,JVM内存分配

一.递归


1.递归计算N!

public class TestDemo {
    public static int fuc(int n){
        if(n==1){
            return 1;
        }else{
            int tmp = n*fuc(n-1);
            return tmp;
        }
    }
    public static void main(String[] args) {
        int ret = fuc(5);
        System.out.println(ret);
    }
}

结束条件其实是归的其实条件(什么时候开始归)

2.按顺序打印一个数字的每个数

public class TestDemo {
    public static void fuc(int n){
        if(n<10){
            System.out.print(n+" ");
        }else{
            fuc(n/10);
            System.out.print(n%10+" ");
        }
    }
    public static void main(String[] args) {
        fuc(1234);
    }
}

3.递归求1+2+3+...+10

public class TestDemo {
    public static int fuc(int n){
        if(n==1){
            return 1;
        }else{
            int tmp = n+fuc(n-1);
            return tmp;
        }
    }
    public static void main(String[] args) {
        int ret = fuc(10);
        System.out.println(ret);
    }
}

4.递归返回一个数的每位的和

public class TestDemo {
    public static int fuc(int n){
        if(n<10){
            return n;
        }else{
            int tmp = n%10+fuc(n/10);
            return tmp;
        }
    }
    public static void main(String[] args) {
        int ret = fuc(12345);
        System.out.println(ret);
    }
}

5.递归求斐波那契数列

public class TestDemo {
    public static int fuc(int n){
        if(n==1||n==2){
            return 1;
        }else{
            int tmp = fuc(n-1)+fuc(n-2);
            return tmp;
        }
    }
    public static void main(String[] args) {
        int ret = fuc(51);
        System.out.println(ret);
    }
}

6.迭代版本的斐波那契

public class TestDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int f1=1;
        int f2=1;
        int f3=1;
        for (int i = 0; i <n-2 ; i++) {
            f3=f1+f2;
            f1=f2;
            f2=f3;
        }
        System.out.println(f3);
    }
}

二.数组


1.定义数组的三种方式

        int[] array = {1,2,3,4,5};
        int[] array2= new int[]{1,2,3,4,5};
        int[] array3= new int [5];

array是一个引用变量,创建在栈上,存放的是堆上的一个地址

如果没有初始化,默认值是0

boolean类型的默认值是false

2.遍历数组的三种方法

1.下标遍历

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
}

2.for each 遍历(加强for循环)

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        for (int x:array){
            System.out.print(x+" ");
        }
    }
}

3.Array.toString遍历(需要导包,输出自动补中括号)

public class TestDemo {
    public static void main(String[] args) {
        int[] array = {1,2,3,4,5};
        String ret = Arrays.toString(array);
        System.out.println(ret);
    }
}

三种输出结果

3.数组是引用类型

1.引用指向(引用)一个对象的内存分布

4.array1=array2

其意思就是把array2的值赋给array1,因为array2的值是其指向的地址,所以array1现在的值变成了array2所指向的地址,则array1与array2共同指向这一块地址。

当没有人引用array1这个对象时,其就会被JVM的垃圾回收器回收了。

5.思考题

下面这段代码会输出什么??

public class TestDemo {
    public static void fuc1(int[]array){
        array = new int[]{1,2,3};
    }
    public static void fuc2(int[]array){
        array[0]=99;
    }
    public static void main(String[] args) {
        int[] array={5,6,7};
        fuc1(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
 
        fuc2(array);
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+" ");
        }
        System.out.println();
    }
}


目录
相关文章
|
6天前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
14 0
|
1月前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
8天前
|
存储 监控 算法
Java内存管理深度剖析:从垃圾收集到内存泄漏的全面指南####
本文深入探讨了Java虚拟机(JVM)中的内存管理机制,特别是垃圾收集(GC)的工作原理及其调优策略。不同于传统的摘要概述,本文将通过实际案例分析,揭示内存泄漏的根源与预防措施,为开发者提供实战中的优化建议,旨在帮助读者构建高效、稳定的Java应用。 ####
22 8
|
14天前
|
Java
java内存区域
1)栈内存:保存所有的对象名称 2)堆内存:保存每个对象的具体属性 3)全局数据区:保存static类型的属性 4)全局代码区:保存所有的方法定义
20 1
|
28天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
45 6
|
5天前
|
存储 监控 算法
Java内存管理的艺术:深入理解垃圾回收机制####
本文将引领读者探索Java虚拟机(JVM)中垃圾回收的奥秘,解析其背后的算法原理,通过实例揭示调优策略,旨在提升Java开发者对内存管理能力的认知,优化应用程序性能。 ####
20 0
|
1月前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
1月前
|
存储 缓存 安全
Java内存模型(JMM):深入理解并发编程的基石####
【10月更文挑战第29天】 本文作为一篇技术性文章,旨在深入探讨Java内存模型(JMM)的核心概念、工作原理及其在并发编程中的应用。我们将从JMM的基本定义出发,逐步剖析其如何通过happens-before原则、volatile关键字、synchronized关键字等机制,解决多线程环境下的数据可见性、原子性和有序性问题。不同于常规摘要的简述方式,本摘要将直接概述文章的核心内容,为读者提供一个清晰的学习路径。 ####
40 2
|
1月前
|
存储 安全 Java
什么是 Java 的内存模型?
Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)规范的一部分,它定义了一套规则,用于指导Java程序中变量的访问和内存交互方式。
68 1
|
1月前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
34 1