java 的 == 行为不一致

2024-04-09

考虑这段代码:

class test {
   public static void main(String[] args) {
      test inst_test = new test();
      int i1 = 2000;
      int i2 = 2000;
      int i3 = 2;
      int i4 = 2;
      Integer Ithree = new Integer(2); // 1
      Integer Ifour = new Integer(2); // 2
      System.out.println( Ithree == Ifour );
      inst_test.method( i3 , i4 );
      inst_test.method( i1 , i2 );
   }
   public void method( Integer i , Integer eye ) {
      System.out.println(i == eye );
   }
}

它打印:

false
true
false

我明白第一个false, == 运算符仅检查两个引用是否作用于同一个对象,在本例中则不然。

下列true and false让我摸不着头脑。为什么Java会考虑i3 and i4平等但是i1 and i2不同的?两者都已包装为 Integer,不应该both评估为假?这种不一致有实际原因吗?


将基元自动装箱为对象(如您的调用中所使用的那样)method使用小值的缓存。来自Java 语言规范第 5.1.7 节 http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#190697:

如果装箱的值 p 为真, false,一个字节,范围内的一个字符 \u0000 到 \u007f,或者 int 或短整型 -128 到 127 之间的数字,然后令 r1 和 r2 是任意两个的结果 p的拳击转换。它总是 r1 == r2 的情况。

紧随其后的规范讨论部分也很有趣。值得注意的是,JVM 可以缓存more如果需要的话,你不能确定这样做的结果:

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

java 的 == 行为不一致 的相关文章

随机推荐

  • Nhibernate:获取真实的实体类而不是代理类[重复]

    这个问题在这里已经有答案了 有没有办法让 nhibernate 返回我的类而不是它的代理类 如果不是偷懒或者不能更新我不介意 您可以使用此代码取消代理类 session PersistenceContext Unproxy proxiedI
  • iTunes风格模态视图控制器链(表单)

    有没有办法实现 iTunes 风格的模态视图控制器链 见截图 我环顾四周但找不到任何关于此的真正问题 我不是在寻找替代品或解决方法 只是想知道是否可以使用当前的 SDK 或 iOS 5 0 尽管我们不应该谈论它 简单的是 否就足够了 对于那
  • 对 Android APK 进行逆向工程以获取代码? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 从 APK 文件获取源代码 https stackoverflow com questions 3593420 android getting source code from an
  • 如何使用 iOS 图表更改无数据消息?

    使用时iOS 图表 https github com danielgindi charts并且没有数据 有一条默认消息显示 没有可用的图表数据 这个默认值可以编辑和处理翻译吗 这是您在显示数据之前自定义图表外观的方法 IBOutlet pr
  • Unescape 或 html 解码

    我正在使用树枝 1 12 2 我的代码从代码隐藏生成一些元素 当使用最新版本的 twig 渲染这些元素时 它们会进行 html 编码 for item in files folders tr class td img src border
  • 为什么即使 use_transactional_fixtures = false after_commit 也没有运行

    rspec 中的事务装置会阻止调用 after commit 但即使我使用以下命令禁用它们 RSpec configure do config config use transactional fixtures false end The
  • 比较 Double 和 Int 的最佳方式是什么?

    以下 C 代码不起作用 int iValue 0 double dValue 0 0 bool isEqual iValue Equals dValue 那么问题来了 比较 Double 和 Int 的最佳方法是什么 您确实不能以天真的方式
  • 交互式闪亮全局日期选择器

    我正在一个没有良好日期选择器的环境中使用 R 并且我正在尝试使用 R 弹出一个日期选择器来填补空白 大多数 R 日期选择器都需要 GTK 等 UI 库 闪亮的没有 我想做的就是弹出一个日期选择器 让用户选择日期 然后结束闪亮的会话并将日期传
  • 如何检测 Java 系统属性是否已更改?

    我想知道系统属性何时更改 我在应用程序服务器中有一个应用程序 它以某种方式更改系统属性 System setProperty 我认为 我看了看 发现了不同的方法 JPDA https stackoverflow com questions
  • Collections.sort 方法抛出类 java.lang.Integer 无法转换为类 java.lang.Double 错误[重复]

    这个问题在这里已经有答案了 我从基于空手道的 API 自动化中的 JSON 响应获取一些运行时值 我将它们存储到 ArrayList 中 例如 def ArrayList Java type java util ArrayList def
  • 具有动态数据库连接的flask-sqlalchemy

    我有一个主数据库 其中存储每个客户端自己的数据库连接 因此每个客户端都使用 2 个数据库 主数据库和自己的数据库 必须确定其连接 对于每个 http 调用 我怎样才能使用flask sqlalchemy扩展来做到这一点 或者可能是 纯粹是s
  • Dart 中的“const”和“final”关键字有什么区别?

    两者有什么区别const and finalDart 中的关键字 dart 的网站上有一篇文章 解释得很好 https news dartlang org 2012 06 const static final oh my html Fina
  • MySQL数据类型仅存储月份和年份[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在编写一个 PHP 应用程序来存储STUDENTMySQL 关系数据库中的数据 我正在尝试找到最好的方法 数据类型来存储月份和年份而不需要日
  • WKHTMLTOPDF 不渲染 Base64 图像

    我有以下简单的 HTML 页面 div img src data image gif base64 R0lGODlhFwAPAKEAAP wAAAMzMzLi3tywAAAAAFwAPAAACQIyPqQjtD98RIVpJ66g3hgEY
  • 分配给模型类中的属性的值在视图/控制器类中消失

    在我的模型类发送变量之前stringToDisplay NSLog 告诉我它有一个值 但是当我尝试在我的 ViewController 中使用它时 我只是得到 null 对我做错了什么有什么想法吗 好消息是 在研究这个问题的过程中 我在理解
  • 让 youtube.com 在 iF​​rame 中加载

    无法获取 Youtube 的主页或任何其他带有 youtube com 前缀的 URL 以加载到 iFrame 中 有什么建议或见解吗 Code YouTube 不允许嵌入 仅有的http www youtube com embed htt
  • 如何使用 WSGI 实现 Flask 应用程序按路径调度?

    我想使用单个域作为多个 Flask 应用程序的暂存环境 这些应用程序最终将在自己的域上运行 就像是 example staging com app1 example staging com app2 example staging com
  • 如何创建表格颤动?

    我有三个列表 我必须生成表格 这些来自用户输入的列表 px 0 1 0 2 0 3 x 0 1 2 这个第三个列表是第一个第二个列表的乘法 Mutiply 0 0 2 0 6 我想生成表格 列表的长度来自用户输入所以 我如何生成表 简单的方
  • Logback-android:日志未写入文件

    尝试使用 logback android 重定向日志消息 以便可以将消息保存在文件中 但是 它没有保存到文件中 这是我的 logback xml 文件配置 它存储在src 主要 资产在我的 Android Studio 中
  • java 的 == 行为不一致

    考虑这段代码 class test public static void main String args test inst test new test int i1 2000 int i2 2000 int i3 2 int i4 2