【问题标题】:Integer v/s int整数与整数
【发布时间】:2012-08-26 19:38:08
【问题描述】:

在 oracle 文档java.lang 页面上阅读此内容:

通常需要将原始类型的值表示为对象。包装类 BooleanCharacterIntegerLongFloatDouble 用于此目的。

我不确定我是否理解为什么需要这些。它说它们具有有用的功能,例如equals()。但如果我能做到(a==b),我为什么要声明它们为Integer,使用更多内存并使用equals()? 2 的内存使用情况有何不同?

【问题讨论】:

    标签: java wrapper primitive


    【解决方案1】:

    Java's generics system 仅支持类类型。而且由于原语不是类,它们不能与泛型一起使用。但是,原语的包装类可以用作泛型类型。例如,您可以不声明ArrayList<int>,但可以使用ArrayList<Integer> 实现类似的功能。

    它也偶尔用于将变量的值初始化为null。然而,基元不能设置为null;该权限是为对象保留的。

    // This is OK
    Integer iDontKnowValueYet = null;
    
    // Compile error!
    int iDontKnowThisYetEither = null;
    

    【讨论】:

    • +1 甚至在泛型之前,集合、列表、集合和映射只存储对象。
    • 我明白了。但是为什么 Java 设计者会设计泛型不使用原语和 int 在初始化时不设置为 null,他们一定看到了使用 Integer 比 int 更有用的东西?
    • 集合不接受原语这一事实与泛型无关。
    【解决方案2】:

    像 int、char、double 这样的东西都是原语,这意味着它们不需要使用“new”来实例化。 Integer、Character、Double 之类的对象在计算机上占用更多空间(因为对象的开销更大),但您可以使用 Integer.parse() 之类的方法。一般来说,使用原语并且仅在需要其中一种方法时才使用对象版本。

    回答关于 a==b 与 a.equals(b) 的问题:

    Integer a = new Integer(5);
    Integer b = new Integer(5);
    

    即使它们是相同的值(这是 .equals 测试的),它们也不是同一块内存,因为您说了两次“新”。 a!=b 但 a.equals(b)

    Integer a = new Integer(5);
    Integer b = a;
    

    现在它们使用相同的内存,意思是如果你改变一个,你就同时改变它们(除非你再次使用“new”)。 a==b 和 a.equals(b)

    //using last code block
    b = new Integer(5);
    

    现在再次 a!=b 但 a.equals(b)==true 因为它们再次具有相同的值但它们位于不同的内存块上。

    【讨论】:

    • 两件事。首先,Integer.parse 也可以用于原始类型。实际上 Integer.parseInt 返回 int 而不是 Integer。其次,您不能按照您的建议更改变量“a”,因为 Integer 是一个不可变类。
    • @axelrod360 我看到,与比较引用相比,equals 可用于比较值。我猜 Integer 里面定义了 parseInt,所以可以从那里调用它。
    【解决方案3】:

    当您将 int 放入数据结构中时,它们通常被包装在包装类中。因此,.equals 方法用于确定何时对数据结构调用 .contains 方法。

    其他有用的方法: 到字符串 toHexString 解析字符串

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      相关资源
      最近更新 更多