Java 所有的原始包装器类都是不可变的对象吗?

Java 所有的原始包装器类都是不可变的对象吗?,java,wrapper,Java,Wrapper,Java中的所有原始包装器类都是不可变对象吗?字符串是不可变的。其他不可变对象是什么?任何类型的对象都是不可变的,它不提供任何方法来更改其中的数据,就这么简单。是的,所有基本包装类型都是不可变的1,就像String一样,还有其他例子 尽管内置Java API中的Calendar和Date是可变的,但其中的许多类型是不可变的——在我看来,这就是为什么Joda Time更容易使用的原因之一。如果一个对象是不可变的,那么您可以在代码中的其他地方保留对它的引用,而不必担心其他代码段是否会进行更改—这样就

Java中的所有原始包装器类都是不可变对象吗?字符串是不可变的。其他不可变对象是什么?

任何类型的对象都是不可变的,它不提供任何方法来更改其中的数据,就这么简单。是的,所有基本包装类型都是不可变的1,就像
String
一样,还有其他例子

尽管内置Java API中的
Calendar
Date
是可变的,但其中的许多类型是不可变的——在我看来,这就是为什么Joda Time更容易使用的原因之一。如果一个对象是不可变的,那么您可以在代码中的其他地方保留对它的引用,而不必担心其他代码段是否会进行更改—这样就更容易对代码进行推理


1我的意思是
java.lang.Integer
等。正如其他地方所指出的,
原子类*
是可变的,为了达到它们的目的,它们必须是可变的。在我看来,“标准的原始包装类集合”和“包装原始值的类集合”是不同的

您可以非常轻松地编写自己的可变包装器类:

public class MutableInteger
{
    private int value;

    public MutableInteger(int value) 
    {
         this.value = value;
    }

    public int getValue()
    {
        return value;
    }

    public void setValue(int value)
    {
        this.value = value;
    }
}
因此,正如您所看到的,包装类并没有本质上是不可变的——只是标准类被设计为不可变的,因为它没有提供任何方式来更改包装值

请注意,这允许在装箱时重复使用相同的对象,用于公共值:

Integer x = 100;
Integer y = 100;
// x and y are actually guaranteed to refer to the same object

Integer a = 1000;
Integer b = 1000;
// a and b *could* refer to the same object, but probably won't
在Java5之前,所有的属性都是不可变的

但是,Java 5中引入的(
AtomicInteger
AtomicLong
AtomicBoolean
AtomicReference
)是可变的。

一个奇怪的“包装器”类是
Void
,它没有任何有效的对象,不可变或其他。只能将其设置为null

Void
的一个用途是将通用返回类型标记为无值。(不能使用基本类型或
void

e、 g

Callable Callable=new Callable(){
公开作废通知(){
//做点什么
返回null;
}
};


尽管日期在技术上是可变的,但我将其描述为“按惯例是不变的”。人们通常理解或假设您不会更改日期对象,但会像更改任何其他不可变对象一样替换它。

当然可以。包装类是不可变的


您可以通过阅读来理解包装类的不变性。

Joda Time可能存在的正确副本。这也是为什么它被认为是JDK中新时间API的基础的原因之一。我知道这个线程在2年前已经被回答了,但我需要知道,因为我头脑混乱@JonSkeet为什么你说在
整数a=1000
整数b=1000
中,a和b可以指同一个对象,但可能不是?而在
整数x=100
整数y=100
中,x和y保证引用同一个对象?@GrahamGriffiths:值确实是这样。请参阅@gkns的最后几段:不是一些JVM。。。所有遵循语言规范的JVM,值为-128到+127(不是相反)。但是,一些JVM可能会缓存更多的值。Java语言规范确实要求表示-128和127之间整数值的
Integer
实例如果表示相同的整数值,则保证它们是相同的。请看。虽然我当然同意原子整数等是可变的,但我不认为这些通常被称为“原始包装类”,因为它们与原始类型的关联不像整数等那么紧密。。。例如,他们不参与拳击。不过,把他们提出来是有用的。@Jon,说得好。我想它们有时被认为是原始包装器,因为
AtomicInteger
AtomicLong
源自
Number
,比如
Integer
Long
。是的。我在回答中对这一点做了更多的探讨——希望你不介意我从你那里获得灵感:)@Jon,你的意思是,与我从你那里获得灵感的所有时间相比?请随便吃:)
Callable<Void> callable = new Callable<Void>() {
    public Void call() {
         // do something
        return null;
    }
};