当前位置: 首页 > 知识库问答 >
问题:

整数对象缓存

卞经业
2023-03-14

我读到“因此当使用Integer.ValueOf创建对象或直接为-128到127范围内的整数赋值时,将返回相同的对象。”

Integer a=100;
Integer b=100;
if(a==b) // return true as both the objects are equal

但这里的输出是“not”

public static void main(String[] args) {

    Integer a = 10;
    Integer b = 12;
    if(a == b)
        System.out.println("same");
    else
        System.out.println("Not");
}

有人能解释一下吗?

共有1个答案

荀嘉熙
2023-03-14

您误解了“相同的对象将被返回”是什么意思。

因此,比较==实际上是比较内存位置,只有当两个变量包含相同的对象(即存储在相同的内存位置)时才返回true。

-128到127之间的值存储在整数常量池中,这意味着每10是相同的10(即相同的内存位置),每12是相同的12,等等,但不是所有的10也都是12,这是你的问题无意中假设的。

public static void main(String[] args) {

    Integer a = 1000;
    Integer b = 1000;
    if(a == b)
        System.out.println("same");
    else
        System.out.println("Not");
}

那将打印“not”,因为AB是存储在不同内存位置的两个不同对象。

这就是为什么您应该使用.equals()进行比较

 类似资料:
  • 有时缓存代码中的单个对象会很有用,比如有些需要很大开销获取的数据或者一些结果集不怎么变化的数据库查询。你可以使用一些缓存软件将这些数据存放在内存中以便下次高速获取。如果你获得数据后把他们存起来,下次请求直接从缓存里面获取数据,在减少数据库负载的同时能极大提高性能。 许多流行的字节码缓存方案也能缓存定制化的数据,所以更有理由好好使用它们了。APCu、XCache 以及 WinCache 都提供了 A

  • 问题内容: 寻找一个适用于Android(SDK 7+)类的简单开源非copyleft缓存。 目的主要是异步存储所获取的s(因此,我不需要将此功能包含在缓存类中)。 我为此目的使用了weakList,这自然是一个糟糕的解决方案,使用Guava缓存会更好一些,但仍然不够好。 最好是,缓存能够存储任何可序列化的对象,而不仅仅是a ,并且当对象添加到缓存中时,我可以轻松清除对象中使用的某些标记。 最好的

  • 问题内容: 在下面的python脚本中,为什么要执行第二个断言(即,将0加到257并将结果存储在y中,则x和y成为不同的对象)?谢谢! 问题答案: 整数是不可变的,因此任何更改它们的操作都将导致新的内存位置 正在检查对象的实际内存位置…并且基本上不应该用于检查值的相等性(尽管它可以在某些情况下任意工作)

  • 问题内容: 我刚刚遇到了Java中的同步块,并编写了一个小程序来测试它的工作方式。 我创建10个线程,并让每个线程将一个Integer对象增加1000次。 因此,在使用同步的情况下,所有线程完成工作后,我将假定结果为10000,而在没有同步的情况下,结果将小于10000。 但是,同步并没有如我所料。 我猜想这与对象的不变性有关。 我的程序: 有人可以澄清吗? 问题答案: 每次您对 进行同步时,sy

  • 我有以下代码: 结果如下: 但是将的类型更改为将产生不同的输出,例如: 新的输出: 怎么会这样?为什么第一个示例代码没有输出?

  • 我有以下代码: 现在我使我的存储库成为反应性的。我的问题是如何使缓存存储现在单声道和通量。 我遇到了以下Mono和Flux缓存,但这只是为了查找,因为我也是反应式编程的初学者。