初学者Java尝试:我是否使用了太多内存?

时间:2015-11-08 09:19:32

标签: java

我是Java新手。我正在网上开一个lynda dot com课程。课程要求你写一个简单的程序:

  1. 要求用户输入2个值
  2. 要求用户输入操作
  3. 对2个值使用操作并打印结果
  4. 这是我写的,它与课程给出的解决方案非常不同。任何人都可以快速查看它并告诉我是否有一些我从根本上做错或低效的事情?我的怀疑是我使用了太多的记忆。非常感谢你的帮助!为了记录,我的代码工作:

    package com.example.java;
    
    import java.util.Scanner;
    
    public class Main {
    
        public static void main(String[] args) {
    
            Scanner scanner = new Scanner(System.in);
    
            System.out.print("Enter a numeric value: ");
            String input1 = scanner.nextLine();
            System.out.print("Enter a numeric value: ");
            String input2 = scanner.nextLine();
    
            double double1 = Double.parseDouble(input1);
            double double2 = Double.parseDouble(input2);
    
            System.out.print("Choose and operation (+ - * /): ");
            String input3 = scanner.nextLine();
    
            double resultAdd = double1 + double2;
            double resultSub = double1 - double2;
            double resultMul = double1 * double2;
            double resultDiv = double1 / double2;
    
            switch (input3) {
                case "+":
                    System.out.println("The answer is " + resultAdd);
                    break;
                case "-":
                    System.out.println("The answer is " + resultSub);
                    break;
                case "*":
                    System.out.println("The answer is " + resultMul);
                    break;
                case "/":
                    System.out.println("The answer is " + resultDiv);
                    break;
            }
        }
    }
    

    以下是教师为记录所写的内容:

    package com.example.java;
    
    import java.util.Scanner;
    
    public class Calculator2 {
    
    public static void main(String[] args) {
        String s1 = getInput("Enter a numeric value: ");
        String s2 = getInput("Enter a numeric value: ");
        String op = getInput("Choose an operation (+ - * /):");
    
        double result = 0;
    
        try {
            switch (op) {
                case "+":
                    result = addValues(s1, s2);
                    break;
                case "-":
                    result = subtractValues(s1, s2);
                    break;
                case "*":
                    result = multiplyValues(s1, s2);
                    break;
                case "/":
                    result = divideValues(s1, s2);
                    break;
                default:
                    System.out.println("Unrecognized operation!");
                    return;
            }
    
            System.out.println("The answer is " + result);
    
        } catch (Exception e) {
            System.out.println("Number formatting exception " + e.getMessage());
        }
    }
    
    private static double addValues(String s1, String s2) {
        double d1 = Double.parseDouble(s1);
        double d2 = Double.parseDouble(s2);
        return d1 + d2;
    }
    
    private static double subtractValues(String s1, String s2) {
        double d1 = Double.parseDouble(s1);
        double d2 = Double.parseDouble(s2);
        return d1 - d2;
    }
    
    private static double multiplyValues(String s1, String s2) {
        double d1 = Double.parseDouble(s1);
        double d2 = Double.parseDouble(s2);
        return d1 * d2;
    }
    
    private static double divideValues(String s1, String s2) {
        double d1 = Double.parseDouble(s1);
        double d2 = Double.parseDouble(s2);
        return d1 / d2;
    }
    
    private static String getInput(String prompt) {
        System.out.print(prompt);
        Scanner sc = new Scanner(System.in);
        return sc.nextLine();
    }
    

    }

1 个答案:

答案 0 :(得分:0)

这是一个非常简单的java程序,它不涉及将对象存储在堆内存中,所以你会没事的。只是想知道什么是java对象,请参阅

https://docs.oracle.com/javase/tutorial/java/javaOO/objects.html

如果您关注的是声明/使用太多局部变量,那么您就可以了,因为局部变量存储在堆栈中,一旦函数结束,它们使用的内存将被释放。对于您的实例,一旦主方法完成运行,即程序结束时,这些变量所保存的内存将再次可用于您的计算机。

Java的垃圾收集机制非常适合清理你。因此,在看到内存不足异常之前,不要过于担心此类实例。 https://docs.oracle.com/javase/7/docs/api/java/lang/OutOfMemoryError.html

顺便提一下BTW效率,你的导师代码比你的好,因为他只进行一次数学运算,而对于你的情况你正在做所有这些只打印所需的结果,所以你基本上是3冗余操作

您的代码也不如您的导师那么健壮。如果用户输入XXX作为数字输入的1,该怎么办?我认为您的程序在尝试将XXX转换为双数据类型时会崩溃。

此外,如果用户输入abc作为操作输入,则不会打印任何内容。

但请注意,您的导师代码也可以改进,例如他正在捕捉一般情况,并假设它将是一个数字格式问题。