为什么 Float 和 Double 包装类在 Java 中是不可变的



字节、短整型和整数维护一个表示 -128 到 127 的缓冲池值。表示"\u0000"到"\u007F"的字符池值。

这样我就可以理解为什么上面的所有包装类都是不可变的。

但是,Float 和 Double 不维护任何缓冲池,那么将这些类设置为不可变的目的是什么?

我从下面的链接中阅读了它:
https://coderanch.com/t/670745/java/Wrapper-Classes-Immutable

首先,如果ByteShortCharacterInteger是不可变的,那么使DoubleFloat可变是非常不一致的。

可变性也有其成本 - 您无法在多个线程之间安全地共享同一资源。按需复制它们非常便宜。

我也没有看到使它们可变的用例 - 如果您想将其用作一些组合的 in/out 参数,这是一个糟糕的设计。

如果标准的基元包装器是可变的,那么你将有效地破坏装箱/拆箱功能。

 Integer mutable = 1;
 mutable.setValue(2);
 Integer one = 1;
 System.out.println(one);   // Prints '1'?  Or '2'?

如果你想要可变的原语包装器,它们或多或少已经以Java SE"原子"类的形式存在;即 AtomicBooleanAtomicIntegerAtomicLong。 这些具有线程安全的优点(但也具有成本)。

其他替代方案包括一个元素数组,使用第 3 方替代方案,例如 Apache Commons MutableInt(等等)类...... 或者以一次大约 10 行代码编写自己的类。

另请参阅:

  • Java 是否有整数、浮点数、双精度、长整型的可变类型?

最新更新