java中奇怪的平等行为[重复]

2024-01-09

看看下面的代码:

Long minima =          -9223372036854775808L;
        Long anotherminima =   -9223372036854775808L;
        System.out.println(minima==anotherminima); //evaluates to false
        System.out.println(Long.MIN_VALUE); 
        Long another= 1L;
        Long one = 1L;
        System.out.println(another == one); //evaluates to true

我无法理解这种行为..?我希望第一个评估也是正确的.. 这就是我所期待的..


JVM 使用一种缓存技术来处理某些范围的自动装箱值。正如规范中所指定的(http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 )

如果装箱的值 p 是 true、false、一个字节或一个在 \u0000 到 \u007f 范围内的字符,或者是 -128 到 127(含)之间的 int 或短数字,则令 r1 和 r2 为以下结果p 的任意两个拳击转换。 r1 == r2 的情况总是如此。

理想情况下,装箱给定的原始值 p 总是会产生相同的引用。实际上,使用现有的实现技术这可能不可行。上述规则是务实的妥协。上面的最后一个子句要求始终将某些公共值装箱到无法区分的对象中。实现可以延迟或急切地缓存它们。对于其他值,此公式不允许程序员对装箱值的身份进行任何假设。这将允许(但不要求)共享部分或全部这些引用。

这确保了在大多数常见情况下,该行为将是所需的行为,而不会造成过度的性能损失,尤其是在小型设备上。例如,内存限制较少的实现可能会缓存所有 char 和 Short 值,以及 -32K 到 +32K 范围内的 int 和 long 值。

因此,1L 在此缓存值中,然后自动装箱给出完全相同的引用,但在数字超出此范围的情况下(如 Long.MIN_VALUE),它不会被缓存,因此会给出不同的实例/引用。

无论如何,在比较对象时,您应该始终使用 .equals()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中奇怪的平等行为[重复] 的相关文章

随机推荐

  • 使用itextsharp将字体嵌入到pdf中

    我尝试使用 itextsharp 5 2 1 0 嵌入字体 但出现错误 字体是 KozGoPro Light otf 经过一番研究后发现它是日语字体 我已经尝试过以下 Dim tblx1 As PdfPTable New PdfPTable
  • HTTP 标头中的“Content-Length”字段是什么?

    这是什么意思 使用标头中指定的编码的编码内容字符串的字节数 内容字符串的字符数 特别是在以下情况Content Type application x www form urlencoded 它是请求或响应正文中数据的字节数 正文是标题下方空
  • 如何将文件句柄传递给函数?

    当我运行下面的代码时我得到 Can t use string F as a symbol ref while strict refs in use at T pl line 21 其中第 21 行是 flock fh LOCK EX 我究竟
  • glDrawElements 使用了错误的 VBO?

    我正在尝试在屏幕上渲染两个不同的对象 据我所知 问题是OpenGL使用了错误的顶点缓冲区 但使用了正确的索引缓冲区 但我不太确定我目前正在做的任何事情 因为我几乎已经开始再次学习OpenGL 这是当前显示的内容 http puu sh ek
  • Python itertools 产品,但有条件吗?

    我有一个函数 fun 需要几个参数 p0 p1 对于每个参数 我给出一个可能值的列表 p0 list a b c p1 list 5 100 我现在可以为 p0 p1 的每个组合调用我的函数 for i in itertools produ
  • en_US 或 en-US,您应该使用哪一个? [复制]

    这个问题在这里已经有答案了 假设您想在数据库中存储用户首选项的区域设置 您将使用哪个值 en US 或 en US 它们是两个标准 但是您更喜欢使用哪一个作为您自己的应用程序的一部分 Updated 似乎许多网站都使用破折号而不是下划线 例
  • 以纱线集群模式在 YARN 上运行 Spark:控制台输出去了哪里?

    我按照此页面在 YARN 上以纱线集群模式运行 SparkPi 示例应用程序 http spark apache org docs latest running on yarn html http spark apache org docs
  • http-equiv="refresh" 是否保留引用信息和元数据?

    如果我设置一个这样的页面 执行重定向时浏览器是否会发送引用者信息和其他元数据 此处测试时 Firefox 和 IEdo not但铬does发送引荐来源网址 尽管这也不一致 无论它是否发送到同一域 因为我找不到任何说明什么的规范should是
  • MVC 的缓存层 - 模型还是控制器?

    我正在重新考虑在哪里实现缓存部分 您认为最合适的实施地点在哪里 在每个模型中 还是在控制器中 方法 1 伪代码 mycontroller php MyController extends Controller class function
  • 从 ActivityGroup 开始ActivityForResult?

    尝试从活动组启动活动时 我似乎无法得到任何结果 我已将 onactivityresult 放入活动和活动组中 具体来说 我试图让用户从 Intent ACTION GET CONTENT 中选择照片 视频 但我从来没有得到任何回报 我究竟做
  • 对于给定的有限代表字符串列表,正则表达式的语法推理?

    我正在分析一个大型公共数据集 其中包含许多详细的人类可读字符串 这些字符串显然是由某些常规 在形式语言理论意义上 语法生成的 逐一查看这些字符串组以了解其中的模式并不太难 不幸的是 大约有 24 000 个独特的字符串被分为 33 个类别和
  • 在 Jersey JAX-RS 服务器中返回大对象时如何设置 Content-Length

    我有时想返回一个大的 几个 MB 二进制对象作为 JAX RS 资源方法的响应 我知道对象的大小 并且希望在响应上设置 Content Length 标头 并且不希望使用分块传输编码 在 Jersey 1 x 中 我使用自定义 Messag
  • Serde 反序列化为多个结构之一?

    有没有一种好的方法可以暂时将 JSON 反序列化为不同的结构 在文档中找不到任何内容 不幸的是 结构有 标签 来区分 如下所示如何有条件地将 JSON 反序列化为枚举的两个不同变体 https stackoverflow com quest
  • pandas 中 header 和 Skiprow 的区别不清楚

    任何人都可以用一个很好的例子来详细说明 header 和skiprows 在语法中的区别 pd read excel 名称 标题 数字 skiprows 数字 您可以关注本文 https towardsdatascience com imp
  • 更新状态 - 为什么在调用 setState 时创建新的状态副本?

    反应文档 永不变异this state直接调用setState 然后 可能会取代你所做的突变 对待this state就好像它是 不可变的 很清楚 class App extends React Component state data 以
  • Django 管理命令在 cron 中不起作用

    我在安排时间时遇到问题manage py celery call myapp tasks mytask对于我的用户 crontab 当 cron 尝试运行该作业时 它会在 stderr 中获取此信息 它会邮寄给我 如 var mail ka
  • Android 对话框中的 EditText

    我已经在对话框中进行了编辑文本 但无法更改高度 AlertDialog Builder editalert new AlertDialog Builder this editalert setTitle messagetitle edita
  • 将颠覆存储库编号放入代码中

    我想实现一种在代码中记录项目版本的方法 以便在测试时使用它并帮助跟踪错误 看起来最好使用的版本号就是 Subversion 的当前修订版号 有没有一种简单的方法可以将这个数字挂接到 在我的例子中是C 头文件或其他文件中 然后我可以在代码中获
  • 安装 GitHub 应用程序时在私有存储库中搜索时出现“验证失败”错误

    我创建了一个 GitHub 应用程序并将其安装在我的帐户中 使其能够访问我帐户中的私有存储库 GitHub 应用程序具有元数据的读取权限 然后 我按照此处的步骤生成了 JWT 并使用它来创建安装访问令牌 我尝试使用此令牌使用 GitHub
  • java中奇怪的平等行为[重复]

    这个问题在这里已经有答案了 看看下面的代码 Long minima 9223372036854775808L Long anotherminima 9223372036854775808L System out println minima