为什么Primitives的包装类没有setter?

And*_*anu 4 java setter immutability wrapper primitive-types

为什么Wrapper类(如Integer,Double等)没有内部原始值的setter是什么原因?

我问这个是因为这种功能会简化微积分,并使Java语言更灵活一些.

让我举几个例子.

1)我们来看下面的例子:

Integer x = new Integer(5);
x++;
Run Code Online (Sandbox Code Playgroud)

幕后的前一个代码是执行自动装箱.就像是:

int x_tmp = x.intValue();
x_tmp++;
x = new Integer(x_tmp); // Yes that's a new memory allocation
Run Code Online (Sandbox Code Playgroud)

由于这个问题,在Wrapper上执行微积分比在普通原始类型上执行要慢.使用setter,可以更容易地增加内部值,而无需在堆上分配另一个对象.

2)另一个困扰我的问题是,在Java中编写交换函数是不可能的,就像我在C(使用指针)或C++(指针或引用)中所做的那样.

如果我写,void swap(Integer x, Integer y)我无法访问内部值因为,并且我将无法交换值.

PS:我的一个朋友建议我应该考虑更大的图景,并考虑并发性和类型不变性.

所以你有解释吗?谢谢!

Chr*_*ian 6

除非您需要将它们放入集合中,否则通常不会使用包装类.如果它们是可变的,那么如果在内部集合中使用它们并且作为哈希表的键,则会产生问题.

集合和哈希表需要哈希值始终相同.