值传递和引用传递

  1. 简介
  2. 进阶
  3. 参考文献

面试官喜欢出这种题目这种题目:

什么是值传递和引用传递?

简介

值传递和引用传递,是两种不同的数据传递方式,是两种「传递者」「接收者」之间传递的方式。

值传递:「传递者」和「接收者」存在了两份相同的数据。没有上下文(context)关系。

引用传递:「传递者」和「接收者」 共用一份数据。两者间具有联系(上下文)。这意味着出现bug时,你需要查找的范围增加了。

总结:两者区别在于隔离性。

进阶

数据流动的角度思考。

1)使用值传递的情况。在多个「接收者」情况下,引用传递是必须禁止的。(多线程/情况过多)

原因:共享数据在运行中被修改,会产生使用者不愿意见到的场景。

1539244826781

2)使用引用传递的场景。

  • 数据流向不可逆,且没有多条路线

1539246351915

  • 数据需要共享(需要像多线程那样考虑各种情况)

1539246526198

另外则是从性能上考虑,参考网站:

摘要几点:

  • 节省克隆的成本(克隆的时间消耗)。
  • 弥补传统语言的问题。(不存在多值返回这种用法)

可控角度思考

考虑是否使用值传递,常常是为了考虑“可控否”。多人合作时候,其他人则为不可控因素,因此,为了将不可控因素转换为可控因素,我们常常使用getter/setter形式对类的读取和写入的入口进行控制,并使用上值传递进行隔离,这样一来就形成了上下文无关。

正因为需要考虑到第三方时候,所以我们会使用值传递。倘若不存在第三方,或者存在明确的概念的情况下,值传递也就可以不必使用了。

1539259630042

参考文献