gpt4 book ai didi

java - java如何存储文字?

转载 作者:行者123 更新时间:2023-12-04 11:25:43 26 4
gpt4 key购买 nike

System.out.println(5678);

这个字面量直接用在打印语句中。但是java是将它直接存储在内存中还是创建一个自动变量然后将其存储在那里?如果第二种情况成立,如果有人碰巧使用相同的变量名访问该变量会发生什么?

最佳答案

说明

Java 在后台所做的一切对用户和程序员都是完全隐藏的。

只要你还在写Java代码,是不可能乱来的。当然,如果您尝试连接 JVM 进程并注入(inject) C 代码,或者通过其 native 接口(interface)与之交互,则可能是另一回事。

这也完全取决于 JVM 如何在内存中实际处理它。在 Java 中,内存管理对程序员是完全隐藏的。


字节码

内联变量

话虽如此,让我们看看这个片段的结果字节码(见 javabytes.io 或使用 javap -c Test.class):

// Source code
public class Test {
public static void main(String [] args) {
int value = 4000;
System.out.println(value);

System.out.println(5678);
}
}

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

public static void main(java.lang.String[]);
Code:
0: sipush 4000
3: istore_1
4: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
7: iload_1
8: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
11: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
14: sipush 5678
17: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
20: return
}

如您所见,这两种变体实际上是相同的。 sipush 命令直接加载值,根本没有任何变量的迹象。

sipushshort 直接压入堆栈,然后由调用 print 方法的 invokevirtual 从中拾取(参见Java bytecode instruction list 了解详情)。

为什么会这样?好吧,编译器很聪明。它认为变量 value 没有任何作用,实际上完全摆脱了它。它将代码更改为 System.out.println(4000) 并完全删除了 value

存在变量

但是我们想看到一些变量,所以让我们让它更复杂一点,这样 Java 就不会通过引入只能在运行时计算的依赖项来内联变量:

// Source code
public class Test {
public static void main(String [] args) {
int value = (int) System.currentTimeMillis();
System.out.println(value);

System.out.println(5678);
}
}

// Byte code
public class Test {
public Test();
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 #2 // Method java/lang/System.currentTimeMillis:()J
3: l2i
4: istore_1
5: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
8: iload_1
9: invokevirtual #4 // Method java/io/PrintStream.println:(I)V
12: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
15: sipush 5678
18: invokevirtual #4 // Method java/io/PrintStream.println:(I)V
21: return
}

终于我们看到了一些可变 Action !该变量由该方法计算,转换为 int,然后通过 istore_1 存储。然后,由iload_1动态加载到栈中,并传递给print方法。

所以通过变量,我们需要istoreiload到方法中。使用文字,我们可以直接使用 sipush 将其加载到方法中。

关于java - java如何存储文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58434404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com