字节、短整型和整数维护一个表示 -128 到 127 的缓冲池值。表示"\u0000"到"\u007F"的字符池值。
这样我就可以理解为什么上面的所有包装类都是不可变的。
但是,Float 和 Double 不维护任何缓冲池,那么将这些类设置为不可变的目的是什么?
我从下面的链接中阅读了它:
https://coderanch.com/t/670745/java/Wrapper-Classes-Immutable
首先,如果Byte
、Short
、Character
和Integer
是不可变的,那么使Double
和Float
可变是非常不一致的。
可变性也有其成本 - 您无法在多个线程之间安全地共享同一资源。按需复制它们非常便宜。
我也没有看到使它们可变的用例 - 如果您想将其用作一些组合的 in/out 参数,这是一个糟糕的设计。
如果标准的基元包装器是可变的,那么你将有效地破坏装箱/拆箱功能。
Integer mutable = 1;
mutable.setValue(2);
Integer one = 1;
System.out.println(one); // Prints '1'? Or '2'?
如果你想要可变的原语包装器,它们或多或少已经以Java SE"原子"类的形式存在;即 AtomicBoolean
,AtomicInteger
和AtomicLong
。 这些具有线程安全的优点(但也具有成本)。
其他替代方案包括一个元素数组,使用第 3 方替代方案,例如 Apache Commons MutableInt
(等等)类...... 或者以一次大约 10 行代码编写自己的类。
另请参阅:
- Java 是否有整数、浮点数、双精度、长整型的可变类型?