当前位置: 首页 > 面试题库 >

为什么整数在Java中是不变的?

凤高澹
2023-03-14
问题内容

我知道整数在Java中是不可变的。但是为什么要这样设计呢?

我找不到强制Integer不可变的用例。是否有类似String的技术原因?

  1. 字符串在网络连接,数据库URL等中用作参数。如果它是可变的,则很容易遭到破坏。
  2. 支持StringPool功能。
  3. 支持使用字符串作为参数的类加载机制。字符串可变会导致加载错误的类。

我知道有些包装很AtomicInteger易变。

更新:

从对话中,并没有普遍的理由要求整数是不可变的。但是,通过做不可变的操作,它会提供一些答案中提到的好处。

缓存的可能性。

其他人正在减少全球状态

更容易的多线程


问题答案:

您不会找到java.lang包装必须是 不可变 的强制性原因。只是因为 这是设计决定 。他们本可以做出其他决定。语言设计师必须在 可变
不变 之间做出选择。他们选择了 不变的 。而已。

有一些 令人信服的 (IMO)原因尽管使它们 不可变

与一致String。您所提供的同样的道理String不变的 适用于Integer等,以及(如想在属性映射端口号)。 这通常适用于
任何 可变类型

不可变 类型排除了许多难以发现的错误,因为人们可以通过修改通过 吸气剂 获得的值来不由自主地更改对象成员值。 当类型 不可变
时,它可以节省大量防御性复制 。最臭名昭著的示例java.util.Date,通常很难使用,因为它是 易变的 (撇开API问题)。

不可变类型还允许使用共享实例,例如Integer常用值的用法(请参阅参考资料Integer.valueOf(int))。



 类似资料:
  • 问题内容: 我了解Python中可变对象和不可变对象之间的区别。我已经阅读了许多讨论差异的文章。但是,我还没有读到任何有关WHY整数是不可变对象的信息。 是否有这个原因?还是答案是“就是这样”? 编辑:我被提示将这个问题与其他问题“区分开”,因为这似乎是先前提出的问题。但是,我相信我要问的更多是哲学性的Python问题,而不是技术性的Python问题。 看来Python中的“原始”对象(即字符串,

  • 问题内容: 有人问我为什么String是不可变的 我这样回答: 当我们在Java中像这样创建一个字符串时,;将在字符串pool(hello)中创建一个对象,并且s1将指向hello。现在再次执行该操作;将不会创建另一个对象,但是s2将指向该对象,hello 因为JVM将首先检查如果在字符串池中是否存在相同的对象, 如果不存在则仅创建一个新对象。 现在,如果假设Java允许串可变那么如果我们改变S1

  • 问题内容: 考虑以下代码: 编译产生错误 因为表达式i / j的类型显然是int,因此必须将其强制转换为short。 为什么类型不短? 问题答案: 从Java规范: 5.6.2二进制数值提升 当运算符将二进制数值提升应用于一对操作数时,每个操作数必须表示一个数值类型的值,以下规则按顺序适用,并根据需要使用加宽转换(第5.1.2节)来转换操作数: 如果一个操作数的类型为double,则另一个将转换为

  • 问题内容: 这可能是有史以来最愚蠢的问题,但我认为对于Java新手来说,这非常令人困惑。 有人可以澄清什么是不变的吗? 为什么是String一成不变的? 不可变对象的优点/缺点是什么? 为什么诸如StringBuilderString之类的可变对象优先于String,反之亦然? 一个很好的例子(在Java中)将不胜感激。 问题答案: 不可变是指一旦对象的构造函数完成执行,该实例将无法更改。 这很有

  • 问题内容: 摘自Joshua Bloch的Effective Java, 数组在两个重要方面不同于通用类型。第一数组是协变的。泛型是不变的。 协变量仅表示如果X是Y的子类型,则X []也将是Y []的子类型。数组是协变的,因为字符串是Object的子类型,所以 不变式仅表示X是否为Y的子类型, 问题答案: Java和C#的早期版本不包含泛型(又称参数多态性)。 在这种情况下,使数组不变会排除有用的