java - 将大对象引用而不是小对象传递给方法在处理或内存消耗方面有什么不同吗?

标签 java memory-management reference

我有一个编码困境,我不知道是否有解决它的模式或实践。每当我必须将一些值传递给方法时,大多数时候我会尝试只传递所需的对象,而不是传递由它们组成的对象。 我正在和一个 friend 讨论 Java 如何管理堆和内存的东西,但我们没有取得任何进展。

举两个例子:

//Example 1:
private void method doSomething(String s, Car car, boolean isReal){...}
...
String s        = myBigObject.getLabels.getMainName();
Car car         = myBigObject.getCar();
boolean isReal  = myBigObject.isRealCar();

doSomething(s, car, isReal);

//Example 2 - having in mind that BigObject is a really big object and I'll only use those 3 atributes:
private void method doSomething(BigObject bigObject){...}
...

doSomething(myBigObject);

在第二个例子中,在我看来内存会有点浪费,传递一个大对象而不是真正需要它。

最佳答案

由于 Java 仅传递对对象的引用(并复制它们,使其在技术上按值传递),因此传递“大对象”没有内存开销。您的示例 1 实际上使用了更多的内存。

但是,这样做仍然有充分的理由:它消除了依赖性并允许您对 大对象。这可能是也可能不是优势。如果使用 BigObject 参数多次调用它,您将有很多重复的代码来提取这些值,这并不好。

另请注意,您不必将返回值分配给局部变量即可传递它们。你也可以这样做:

doSomething(myBigObject.getLabels().getMainName(), 
            myBigObject.getCar(), 
            myBigObject.isRealCar());

关于java - 将大对象引用而不是小对象传递给方法在处理或内存消耗方面有什么不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16246264/

相关文章:

linux - 如何在 ucontext* ,linux 中释放堆栈?

android phonegap 应用程序在加载太多 javascript 时失败

C# - 组件引用 - Dispacher.CheckAccess()

c# - 找不到命名空间!

c++ - 为什么这个程序在 C++14 中编译得很好,但在 C++11 编译器中却不行?

java - 如何将一个节点链插入另一个节点链

java - 如何将 ' 和 %27 转换为单引号

ios - 进入后台时暂停WKWebView?

java - Google App Engine (Java) - JDO PersistenceManager makePersistentAll 速度减慢

java - 从多线程读取一个HashMap会有问题吗?