5

我仍然是java的初学者,我对传递参数的有效方法有疑问。在方法中传递对象时,传递对象的某些部分是否更有效,或者根本不重要?例如,假设我有一个 Person 对象,它具有多个属性(姓名、身高、性别、位置、头发颜色等),并且我有一个需要处理其中两个属性的方法。当我将信息传递给方法时,它是否节省了我的内存、处理时间等以仅传递所需的信息(如名称和位置),还是与仅传递整个 person 对象相同?

是:

public void getNamePlace(String name, String location){
\\\\work here
}

任何不同的效率方面:

public void getNamePlace(Person person){
\\\\work here and get the name location in the method
}

非常感谢您的帮助。如果这是一个愚蠢的问题,我很抱歉,但我正在努力找出解决这个问题的最佳心态。谢谢你。

ps我更多地考虑方法调用本身。它是如何工作的。单独来看,是:

public void getNamePlace(String name, String Location) --> 比传递的位数和使用的内存多 --> public void getNamePlace(Person person)

4

8 回答 8

10

您正在传递参考值。您传递的值越多,完成的工作就越多。

这是一个可测量的差异吗?从技术上讲,是的——但在极端情况下是微不足道的(例如,另一个参数是另一个字节码,仅此而已。性能和类大小的差异非常小。)

这是一个明显的区别吗?不。

这里的心态是,过早的优化,特别是在这个级别,是不需要处理的。

其他人指出,可读性和数据问题更为重要。

于 2012-08-16T18:23:56.173 回答
4

它“根本不重要”。在 Java 中,您只需将对象的引用(作为值)传递给函数。这是一个非常小的数据类型,它告诉虚拟机对象在内存中的位置。

看看Java是“按引用传递”还是“按值传递”?一个很好的答案;)

于 2012-08-16T18:23:18.723 回答
4

当你使用这个:

public void getNamePlace(Person person){
   \\\\work here and get the name location in the method
}

除了对 type 的实际对象的引用(松散意义上的“指针”)之外,实际上没有任何东西传递给该方法Person。不会复制成员,因为您正在指示方法“您可以在此内存位置找到所需的一切”。

因此,从技术上讲,传递有限数量的字段person实际上比传递“整个人”更糟糕(尽管差异并不明显)。:)

于 2012-08-16T18:23:38.700 回答
3

java中的对象是通过引用传递的。简短的回答是只传递你的对象。

长答案是对象引用是 32 位或 64 位,具体取决于您的 java 安装。64 位的数量是 JVM 的典型填充大小的两倍(在某些情况下,即使在 64 位系统上通常也是 32 位)。取消引用引用会产生少量开销,但 JIT 编译器通常会将其优化为恒定量,而不是重复命中。此外,您总是必须在某个时候取消引用它,无论是在函数内部还是外部。您不妨只保存堆栈空间并通过引用传递对象。

于 2012-08-16T18:25:14.953 回答
2

您正在使用getNamePlace(String,String)而不是传递一个额外的地址getNamePlace(Person)

PersonJava在传递对象时不会对其进行复制;它通过了参考。

同样,Java 在传递字符串时不会复制它们;它通过了引用。

您会注意到显着的性能差异吗?不。

于 2012-08-16T18:26:20.163 回答
2

考虑到时间和效率,这并不重要。

但是,如果您想编写可读的代码,这确实很重要。- 将逻辑连接的项目分组为它们所代表的对象总是很好的

例如:

writeLetterTo(person);

比这好得多:

writeLetterTo(name, surname, address, city, country);

如果只有所有这些参数可以以某种方式从人对象中获取。

另一个例子:

addTwoPionts(x1, x2, y1, y2); // ugly
addTwoPoints(point1, point2); // far better 
于 2012-08-16T18:26:55.377 回答
2

除了方法参数之外,您还应该调整几件事:

public void getNamePlace(Person person){
    \\\\work here and get the name location in the method
}

养成正确的习惯

  • getNamePlace什么都不返回时的方法名称不符合约定。getXXXX应该返回值。
  • 由于getNamePlace将对其进行操作,Person因此它应该在类本身中定义,然后您无需传递任何参数。
  • 最后回答你的问题,你不应该太在意这种微优化,所以最初在语言学习图中......它几乎没有任何区别。
于 2012-08-16T18:28:26.730 回答
1

我个人不会太在意这个。如果您真的非常关心性能,您可能应该考虑使用较低级别的语言。正如其他人所说,两者之间实际上没有任何性能差异,尤其是在仅传递变量时。

如果您确实遇到性能问题,我怀疑您的代码中还有许多其他地方会减慢您的速度,而不是参数传递。

于 2012-08-16T18:26:49.977 回答