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