我已经在书中的某处读到,不可变字符串可以比可更改字符串更有效地实现。
与Changeable相比,Immutable String的效率如何?
我的意思是Immutable和changeable string之间的实现差异是什么使得Immutable字符串更有效...... ??
答案 0 :(得分:4)
可变对象和不可变对象都有自己的用途,优点和缺点。
在许多情况下,不可变对象确实使生活变得更简单。它们特别适用于价值类型,其中对象不具有身份,因此可以轻松替换它们。并且它们可以使并发编程更安全和更清晰(大多数众所周知的很难找到并发错误最终是由线程之间共享的可变状态引起的)。然而,对于大型和/或复杂对象,为每个单独的改变创建对象的新副本可能是非常昂贵和/或繁琐的。对于具有不同身份的对象,更改现有对象比创建新的已修改副本更加简单直观。
想想一个游戏角色。在游戏中,速度是最重要的,因此用可变对象表示你的游戏角色很可能会使你的游戏运行速度明显快于另一个实现游戏角色的新副本为每一个小变化产生的效果。
此外,我们对现实世界的看法不可避免地基于可变对象。当你在加油站用汽油填满你的汽车时,你一直认为它是同一个物体(即它的状态在状态改变时保持其身份) - 不像是带有空油箱的旧车被连续换新他们的坦克逐渐越来越充满的汽车实例。因此,每当我们在程序中对某个真实域进行建模时,使用可变对象来表示真实世界的实体通常会更直接,更容易地实现域模型。
答案 1 :(得分:0)
使用不可变字符串可以进行字符串链接,这可以加快性能。另一方面,如果您要将多个大字符串连接在一起,那么使用不可变字符串的效率会非常低。
答案 2 :(得分:0)
字符串不变性使得共享它们成为可能,这在内存方面更有效。
答案 3 :(得分:0)
我不会说不可变对象效率更高;即使它不像可变对象那样有效,它也是更优选的
易于维护意味着,一旦创建了不可变对象,当您将其传递到多个业务层时,其状态就无法更改(错误地);因此,它减少了与错误状态变化相关的缺陷数量
您还可以在多线程环境中共享不可变对象,而不必担心数据冲突,因为无法更改对象的状态。
例如: BigDecimal
可以想象,每个州/数据都需要一个新对象。您可以通过为流行值实现缓存机制来稍微提高性能。
例如: BigDecimal.ZERO
据说,你应该尝试尽可能地创建你的用户域对象(通过提供有限的setter方法),因为容易维护不可变对象的优势超过了可变对象的性能。