首页 > 编程语言 >Java第五课_函数重载递归和初识数组

Java第五课_函数重载递归和初识数组

时间:2023-12-07 22:55:59浏览次数:50  
标签:Java int 第五课 System 初识 static 数组 println out

1.函数

  • 重载

            // 关键字 :public,static等
            // 保留字 : 关键字的预备役   var,goto
            // jdk11开始,还有JS里var升级为关键字: var  变量名 = 初始值 ;
    
            // 重载 / overload : 在同一个类中,允许函数重名 , 但是他们的 参数列表必须不同.
            //          1.参数个数不同    2. 参数类型不同
            //    注意 : 1.形参的名字  2.返回值类型  这两个因素不同也不能重载
            //例如System.out.println(),就使用到了重载
            System.out.println(123);
            System.out.println("abc");
    
            System.out.println(add(10));
            byte b = 127;
            System.out.println(add(b));
            System.out.println(add(b, 3306));//重载同样适用自动类型转换. 没有定义的函数,如果能自动类型转换,也能正常调用
        }
        // 计算任意个数的加法
        public static double add(int i){
            return ++i;
        }
    
        public static double add(byte i){
            return ++i;
        }
    
        public static double add(int i, int j){
            return i + j;
    
  • 递归

        // recursion/递归 : 函数自己调用自己称为递归
        //      前提 : 必须有结束条件并且不能递归太深
        public static void main(String[] args) {
            // 斐波那契数列 1,1,2,3,5,8,13,21.....
            // 从第二项开始,每一项都等于前两项之和.  n = (n-1) + (n-2)
            System.out.println(recursion(30));
            System.out.println(recursion(5));
        }
    
        static int recursion(int num){
            if (num == 1 || num == 2) {
                return 1;
            }
            return recursion(num - 1) + recursion(num - 2); // n = (n-1) + (n-2)
        }
    
  • 代码优化

            // 问题-----百钱买百鸡:一只公鸡值5元钱,一只母鸡值3元钱,三只小鸡值1元钱。  现用百元买百鸡,请问各多少只鸡。
    
            // 第一个程序,单纯的三次循环,各100次
            long startTime = System.nanoTime();// 获得当前时间(纳秒) 等同于 Date中的getTime();
            for (int x = 0; x <= 100; ++x) {
                for (int y = 0; y <= 100; ++y) {
                    for (int z = 0; z <= 100; ++z) {
                        if (x + y + z == 100 && 5 * x + 3 * y + z / 3 == 100 && z % 3 == 0) {
                            System.out.println("x = " + x + " , y = " + y + " , z = " + z);
                        }
                    }
                }
            }
            long endTime = System.nanoTime();// 程序结束时间
            System.out.println((endTime - startTime) + " 纳秒! ");
    
            // 第二个程序,因为公鸡不可能超过25,母鸡33,所以设定时无需100次循环
            startTime = System.nanoTime();
            for (int x = 0; x <= 25; ++x) {
                for (int y = 0; y <= 33; ++y) {
                    for (int z = 0; z <= 100; ++z) {
                        if (x + y + z == 100 && 5 * x + 3 * y + z / 3 == 100 && z % 3 == 0) {
                            System.out.println("x = " + x + " , y = " + y + " , z = " + z);
                        }
                    }
                }
            }
            endTime = System.nanoTime();
            System.out.println((endTime - startTime) + " 纳秒! ");
    
            // 第三个程序,小鸡必然是3只一起,因此也无需100次循环
            startTime = System.nanoTime();
            for (int x = 0; x <= 25; ++x) {
                for (int y = 0; y <= 33; ++y) {
                    for (int z = 0; z <= 100; z += 3) { // z+=3,无需+1+1进行
                        if (x + y + z == 100 && 5 * x + 3 * y + z / 3 == 100) {
                            System.out.println("x = " + x + " , y = " + y + " , z = " + z);
                        }
                    }
                }
            }
            endTime = System.nanoTime();
            System.out.println((endTime - startTime) + " 纳秒! ");
    
            // 第四个程序 x + y + z == 100,因此z = 100 - x - y. 小鸡无需再循环,两个循环就可以
            startTime = System.nanoTime();
            for (int x = 0; x <= 25; ++x) {
                for (int y = 0; y <= 33; ++y) {
                    int z = 100 - x - y;
                    if (5 * x + 3 * y + z / 3 == 100 && z % 3 == 0) {
                        System.out.println("x = " + x + " , y = " + y + " , z = " + z);
                    }
                }
            }
            endTime = System.nanoTime();
            System.out.println((endTime - startTime) + " 纳秒! ");
    
            // 第五个程序 在第四个程序的基础上,将z % 3 == 0提前.
            // 因为 z % 3 == 0 计算量小,&&后如果false,后面运算量较大的表达式,就不用再执行了
            startTime = System.nanoTime();
            for (int x = 0; x <= 25; ++x) {
                for (int y = 0; y <= 33; ++y) {
                    int z = 100 - x - y;
                    if (z % 3 == 0 && 5 * x + 3 * y + z / 3 == 100) { // 将z % 3 == 0提前
                        System.out.println("x = " + x + " , y = " + y + " , z = " + z);
                    }
                }
            }
            endTime = System.nanoTime();
            System.out.println((endTime - startTime) + " 纳秒! ");
    
            // 第六个程序 直接在开头声明x,y,z.这样第二个循环时,不用每次都对y,z 声明-赋值,只需要赋值即可,节省了一个步骤
            startTime = System.nanoTime();// 单位纳秒
            for (int x = 0, y, z; x <= 25; ++x) {
                for (y = 0; y <= 33; ++y) {
                    z = 100 - x - y;
                    if (z % 3 == 0 && 5 * x + 3 * y + z / 3 == 100) {
                        System.out.println("x = " + x + " , y = " + y + " , z = " + z);
                    }
                }
            }
            endTime = System.nanoTime();// 单位纳秒
            System.out.println((endTime - startTime) + " 纳秒! ");
            /*
                总结:提升程序效率基本有两点
                1.考虑需求的实际情况,在逻辑层面,减少对于不可能(不必要)情况的判定.尤其是一些数学问题,考虑清楚逻辑,可以减少很多无意义运算.
                2.注意Java语言本身的特性,在语言特性方面,例如程序五,程序六,减少无效操作.也可以提升效率.
            */
    

2.数组

  • 初识数组

            /*
                数组/Array : 一组相同类型的数据的组合
                声明 :
                    1.数据类型[] 数组名; // 开发推荐
                    2.数据类型 数组名[];
             */
            int[] arr1;
    
            // 初始化 :
            // 1.静态初始化 :  数据类型[] 数组名  =  new  数据类型[]{具体的变量(元素),多个元素之间逗号隔开} ;
            arr1 = new int[]{}; // 没有元素的数组称为空数组 , 就是元素个数为 0 的数组
            int[] arr2 = {1,2,3}; // 如果声明和赋值一起,可以用这种写法,不然
            //arr1= {1,2,3}; 声明和赋值不一起,就不能这样写,只能用下面方式赋值:
            arr1 = new int[]{5,6,7};
    
            // 数组中元素的个数 :  数组名.length
            System.out.println("arr1.length = " + arr1.length);
            System.out.println("arr2.length = " + arr2.length);
    
            // 区分元素 :  数组名[索引值]
            // 索引值/index : 从 0 开始 依次递增    最后一个元素的索引值 :数组名.length - 1
            System.out.println(arr2[arr2.length - 1]);
    
            //数组变量本身记录的值,是数组的地址
            System.out.println(arr1);// [: 数组      I : int    @ : 分隔符    1b6d3586 : 十六进制地址值
    
            // 2.动态初始化 :
            // new : 是在堆内存中开辟新的空间
            // 动态声明 : 数据类型[] 数组名 = new 数据类型[元素个数] ;
            int[] arr3 = new int[5];
            int[] arr4 = new int[5];
            System.out.println(arr1 == arr2);// false,new会开辟新空间
    
            System.out.println(arr3[0]);
            // 动态声明的数组都是有默认值的.数值是0,字符是' ',布尔是false
    
  • 数据传递

        public static void main(String[] args) {
            /*
                调用函数时,需要注意:
                    1.基本数据类型之间是值传递
                    2.引用数据类型之间是地址值传递
                不然会有意料外的值变动
             */
    
            int i = 10;
            int result = m1(i);
            System.out.println("i = " + i);// 10
    
            int[] arr = {10, 10, 10};
            m2(arr);
            System.out.println(arr[0]);// 11
        }
    
        private static int m1(int num) {
            return ++num;
        }
    
        private static void m2(int[] array) {
            ++array[0];
        }
    

标签:Java,int,第五课,System,初识,static,数组,println,out
From: https://www.cnblogs.com/shinya/p/17884188.html

相关文章

  • 前端学习-JavaScript学习-js基础-API02
    学习视频:黑马程序员视频链接事件监听三要素:事件源、事件类型、事件处理程序随机点名案例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"&......
  • Java 读取EXCEL表格中的数据,将数据转为SQL语句
    **[参考文档](https://blog.csdn.net/wl_Honest/article/details/83985751?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_utm_term~default-0-83985751-blog-81103171.pc_relevant_paycolumn_v3&spm=1001.2101.3001.4242.1&utm_relevant_index=3)......
  • Java登陆第二十天——HTML常用标签
    文本标签文本常用的HTML标签:标签名标签描述<h1></h1>标题标签<h6></h6>标题标签<p></p>段落标签<hr>换行标签<br>换行标签标签栗子:<!DOCTYPEhtml><htmllang="en"><head><metacharset=&quo......
  • 4 种方法,帮你快速新建 Java 项目!
    大家好,我是鱼皮。今天给大家分享常用的快速初始化Java项目的几种方法。比较全面,有一些方法你可能并不知道,但如果都掌握的话,基本上够用一辈子了哈哈。如何快速初始化Java项目?1、使用开发工具Java开发者最常用的开发工具当属JetBrainsIDEA了!IDEA不仅功能完善、插件丰富,而且......
  • Java File类详解(下)练习部分
    练习第一题需求:在当前模块下的aaa文件夹中创建一个a.txt文件importjava.io.File;importjava.io.IOException;publicclassFileExer01{publicstaticvoidmain(String[]args)throwsIOException{Filef1=newFile("AllInOne\\aaa");f1.mkdirs();Filesrc=ne......
  • Java编写单元测试用例
    Java编写单元测试用例01简介Java中可以使用多个测试框架来执行单元测试,其中最流行的测试框架之一是JUnit。下面是一个简单的示例,说明如何使用JUnit框架编写和执行单元测试:02一、JUnit包导入importorg.junit.*;03二、创建测试类这个类需要使用“@RunWith’和@Suite”注......
  • Java单元测试浅析(JUnit+Mockito)
    Java单元测试浅析(JUnit+Mockito)作者:京东物流秦彪1.什么是单元测试(1)单元测试环节:测试过程按照阶段划分分为:单元测试、集成测试、系统测试、验收测试等。相关含义如下:1)单元测试:针对计算机程序模块进行输出正确性检验工作。2)集成测试:在单元测试基础上,整合各个模......
  • java 单元测试之 - Spring框架提供的单元/集成测试注解
    java单元测试之-Spring框架提供的单元/集成测试注解Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注:这里的集成测试指容器内部的集成测试,非系统间的集成测试),先看看Spring框架提供了哪些注解以及对应的作用。@RunWith(SpringRunner.class)/@ExtendWith(Spring......
  • Java Mockito 快速入门指南 Mock是指使用Mockito创建的模拟对象,它模拟真实对象的行为,
    JavaMockito快速入门指南Mock是指使用Mockito创建的模拟对象,它模拟真实对象的行为,用于替代真实对象的依赖项,以便进行独立的单元测试在软件开发中,单元测试对于确保代码的正确性和可靠性至关重要。Mockito是一个强大的Java测试框架,它提供了丰富的功能和方法,使得编写模拟测试变得......
  • Java基本数据类型转换
    1.Java基本数据类型转换1.1自动类型转换当Java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型这个就是自动类型转换数量类型按精度大小排序为:char<int<long<float<doublebyte<short<int<long<float<doubleinta='c';doubled=80注意:有多种类型......