java [已关闭]

yc0p9oo0  于 2023-10-14  发布在  Java
关注(0)|答案(1)|浏览(79)

已关闭,此问题需要details or clarity。它目前不接受回答。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

昨天关门了。
Improve this question
在Java中,下面的代码是一个好的做法还是坏的也建议一个内存效率的方式

int num1 = (int) Math.random(),
    num2 = (int) Math.random(),
    sum  = (num1 + num2);
 
System.out.print("sum is " + sum);

我想知道最有效和最合适的惯例。

pprl5pva

pprl5pva1#

一般来说,在Java中这样做是非常好的。关于性能和内存消耗,与逐行声明变量相比,您的方法没有什么区别,如下所示:

int num1 = (int) Math.random();
int num2 = (int) Math.random();
int sum  = (num1 + num2);

默认的Java编译器会将变量声明转换为优化的机器码,因此这两种不同的方法通常会导致Java虚拟机在终端设备上执行相同的字节码。
我测试了OpenJDK17附带的标准编译器的输出。
我创建了两个名为TestFileSL.java(单行变量声明)和TestFileML.java(多行变量声明)的测试文件,然后使用javac命令将它们编译为.class文件。然后我使用javap -c命令打印类文件的内容。下面提供了这两个文件的输出。正如你所看到的,除了类名之外,它们是完全相同的:

public class TestFileSL {
  public TestFileSL();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #7                  // Method java/lang/Math.random:()D
       3: d2i
       4: istore_1
       5: invokestatic  #7                  // Method java/lang/Math.random:()D
       8: d2i
       9: istore_2
      10: iload_1
      11: iload_2
      12: iadd
      13: istore_3
      14: getstatic     #13                 // Field java/lang/System.out:Ljava/io/PrintStream;
      17: iload_3
      18: invokedynamic #19,  0             // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
      23: invokevirtual #23                 // Method java/io/PrintStream.print:(Ljava/lang/String;)V
      26: return
}
public class TestFileML {
  public TestFileML();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: invokestatic  #7                  // Method java/lang/Math.random:()D
       3: d2i
       4: istore_1
       5: invokestatic  #7                  // Method java/lang/Math.random:()D
       8: d2i
       9: istore_2
      10: iload_1
      11: iload_2
      12: iadd
      13: istore_3
      14: getstatic     #13                 // Field java/lang/System.out:Ljava/io/PrintStream;
      17: iload_3
      18: invokedynamic #19,  0             // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
      23: invokevirtual #23                 // Method java/io/PrintStream.print:(Ljava/lang/String;)V
      26: return
}

如果您的代码使用java.lang.Math包的静态方法Math.random(),则此方法将返回一个介于0和1之间的随机double。因此,当将其转换为int时,变量和总和将始终为0。要访问一个类的静态方法,你需要写类名,所以在你的例子中应该是Math.random()而不是math.random()

相关问题