【问题标题】:Java 1.4: Cast primitive type to Object (Coupling vs Performance?)Java 1.4:将原始类型转换为对象(耦合与性能?)
【发布时间】:2011-03-16 14:07:16
【问题描述】:

这实际上与我之前提出的一个问题有关,但我一直在纠结这个细节。我仅限于 Java 1.4,我想将 int 类型转换为 Object。我真的需要使用Integer 类对象还是有办法直接转换它(1.4 中没有自动装箱)。这种“手动装箱”的成本是否值得将整个类从第 3 层导入到第 1 层,从而增加耦合?

【问题讨论】:

    标签: java performance coupling


    【解决方案1】:

    在 Java 1.4 中没有简单的方法将原语转换为其基于对象的双胞胎,但有一种慢速和快速的方法。 new Integer(int) 很慢,Integer.valueOf(int) 很快。对于所有其他数字类型也是如此。

    在 Java 5 中,您不需要那么多代码,但在内部,当您使用自动装箱时,编译器会为您插入对 valueOf() 的调用。

    【讨论】:

    • X is slow and Y is fast 有点过于明确了,我想说。在大多数情况下(即对于缓存范围之外的值)它们会执行相同的操作(并且 valueOf 有一个方法调用开销),如果没有,即使 new Integer(int) 也不应该那么慢 - 只有最终的变量内存屏障可能会打击你,如果使用多个线程。
    • 我不认为 new Integer(int) 很慢...只是内存效率较低,因为它不能使用 -128 到 127 缓存。
    • 总而言之,实例化一个Integer对象比紧耦合好?
    • @Aaron:在一般情况下(参数不在 -128 到 127 范围内)valueOf最多new 稍慢,因为它有方法调用开销,一个或两个布尔检查和然后一个new。我完全不反对最好使用valueOf...我只是不认为你给出的使用它的理由是完全准确的。
    • Integer.valueOf(int) 在 Java 1.4 中不存在,只有 valueOf(String),这似乎不能保证缓存,所以 new Integer(int) 是唯一的选择。
    【解决方案2】:

    在您的 Java 1.4 环境中,您不能将 int 强制转换为 Object,因为它不是 Object。

    Java 区分原始类型和引用类型。 int 是原始类型。 boolean、byte、char、short、long、float 和 double 也是如此。

    引用类型的值是对某个对象的引用。 “对象”是所有对象的根类。

    在 Java 1.5 及之后的版本中,自动装箱将导致第二个变量指向与原始变量 i 具有相同值的 Integer 对象。

        int i = 99;
        Object o = (Object) i;
    

    【讨论】:

    • 我想了这么多。但是使用整数比增加耦合更好吗?我可能会传递一个 Object[] (结果会包含一个整数和一个字符串)或整个类,但我必须将一个类从第 3 层导入到第 1 层。哪一个更好?我倾向于解耦,因为我认为性能影响不会很大,但我不是 Java 专家。
    • 耦合可能会影响架构的灵活性。但是与 java.lang 中的类的耦合应该无关紧要,而且我看不出它会如何影响性能。
    • 就像我说的,我不是 Java 专家,在使用嵌入式应用程序时,性能是一个非常重要的问题。但我已经确定了,毕竟我会使用 Integer 对象。
    猜你喜欢
    • 2013-01-12
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多