Java中的高效方法参数

时间:2012-08-16 18:18:47

标签: java

我仍然是java的初学者,我对传递参数的有效方法有疑问。在方法中传入对象时,传递对象的某些部分或者根本不重要是否更有效?例如,假设我有一个Person对象,它有几个属性(名称,高度,性别,位置,hairColor等),我有一个方法需要处理其中两个属性。当我将信息传递给方法时,它是否会节省我的内存,处理时间等,只传递所需的信息(如名称和位置),还是仅仅传递整个人物对象?

是:

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

任何不同的效率:

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

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

P.S。我正在考虑更多关于方法调用本身。它是如何工作的。孤立地是:

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

8 个答案:

答案 0 :(得分:10)

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

这是可衡量的差异吗?从技术上讲,是 - 但在极端中微不足道(例如,另一个参数是另一个字节码,这就是全部。性能和类大小差别很小。)

这是明显的区别吗?否。

这里的心态是过早优化,特别在这个层面,不是要处理的事情。

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

答案 1 :(得分:4)

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

看看Is Java "pass-by-reference" or "pass-by-value"?获得一个非常好的答案;)

答案 2 :(得分:4)

使用时:

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

实际上没有任何内容传递给方法,除了引用(松散意义上的“指针”)到类型Person的实际对象。不会复制成员,因为您指的是“您可以在此内存位置找到所需的所有内容”。

因此从技术上传递来自person的有限数量的字段实际上比传递“整个人”更糟糕(尽管差异无论如何都不明显)。 :)

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

您使用getNamePlace(String,String)而不是getNamePlace(Person)传递额外的地址。 Java传递时不会复制Person对象;它通过了参考。 同样,Java在传递时不会复制字符串;它传递了参考文献。

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

答案 5 :(得分:2)

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

但是如果你想编写可读代码,这很重要。 - 将逻辑上连接的项目分组,它们代表的对象

总是很好的

例如:

writeLetterTo(person);

更强更好:

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

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

另一个例子:

addTwoPionts(x1, x2, y1, y2); // ugly
addTwoPoints(point1, point2); // far better 

答案 6 :(得分:2)

除了方法参数之外,还有一些你应该调整的事情:

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

让习惯正确

  • getNamePlace方法名称在返回任何内容时不符合约定。 getXXXX应该返回值。
  • 由于getNamePlace将在Person上运行,因此应在类本身中进行定义,然后您无需传递任何参数。
  • 最后回答你的问题,你不应该过多关注这样的微优化,所以最初在语言学习图中...它几乎没有任何区别。

答案 7 :(得分:1)

我个人不会太在意这件事。如果您真的关心性能,那么您可能应该使用较低级别的语言。正如其他人所说,两者之间没有任何性能差异,特别是在传递变量方面。

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