使用 Java IO 流时,我们经常仅将对象用作其他对象的构造函数。我对这种前景的记忆影响感兴趣。例如,在这两个执行相同操作的语句中,内存分配有何不同?
FileInputStream inputFile = new FileInputStream("filepath");
Scanner inStream = new Scanner(inputFile);
和
Scanner inStream = new Scanner(new FileInputStream("filepath"));
第一个将在当前堆栈帧中分配一个命名变量。在堆上,没有区别 - 或者不应该有,但只要遵守规则,VM 当然可以以某种方式自由优化代码。
没有区别。两者是相同的。
在第一个例子中,JVM保留对FileInputStream的引用,而第二种方式是JVM创建一个未引用的对象,该对象在语句执行后准备被垃圾回收。