【问题标题】:Casting and Generics, Any performance difference?铸造和泛型,任何性能差异?
【发布时间】:2011-08-02 18:08:30
【问题描述】:

我最近经常在 Android 中编码,虽然我对 JAVA 很满意,但缺少一些 关于那里使用的核心概念的想法。

我很想知道这两个代码之间是否存在任何性能差异。

第一种方法:

//Specified as member variable.   
ArrayList <String> myList  = new ArrayList <String>(); 

并用作String temp = myList.get(1);

第二种方法:

ArrayList myList  = new ArrayList(); //Specified as member variable.   

并使用

String temp1 = myList.get(1).toString();   

我知道它是关于铸造的。第一种方法是否比第二种方法有很大的优势, 大多数时候在实际编码中我必须使用第二种方法,因为 arraylist 可以采用不同的数据类型,我最终指定了

ArrayList <Object> = new ArrayList <Object>(); 

或更通用的方式。

【问题讨论】:

  • 1,941 代表,您无法正确格式化您的代码? :) (你为什么使用&lt;pre&gt; 标签和&amp;lt; 字符?&amp;lgt; 序列是一个特别痛苦的清理)
  • 另外,如果你的“arraylist 可以采用不同的类型”并且你经常使用ArrayList&lt;Object&gt;,那么你的类设计可能有问题。
  • @Krik Woll - 我猜你的方法是很难告诉解决方案:) 无论如何,我正在创建我的网站,我将根据自己的喜好整齐地格式化代码:) 和 Git。我会记住你的建议。
  • @Krik Woll - 关于班级设计的确如此,随着我的进步,我创造了更好的班级结构。我的意思是告诉那里使用了更通用的(如对象)类型。
  • 我最终只写了一个性能测试。见下文。它们的速度相同。

标签: java android casting


【解决方案1】:

简而言之,没有值得担心的性能差异,如果它存在的话。无论如何,通用信息不会在运行时存储,因此实际上并没有发生任何其他事情来减慢速度 - 正如其他答案所指出的那样,它甚至可能更快(尽管假设它稍微慢一些,我仍然提倡使用泛型。)养成不在这个级别上过多考虑性能的习惯可能是件好事。可读性和代码质量通常比微优化更重要!

简而言之,泛型将是首选选项,因为它们保证类型安全并使您的代码更清晰易读。

就您在数组列表中存储完全不同的对象类型(即与您正在使用的某些继承层次结构无关)这一事实而言,这几乎肯定是您的设计缺陷!一方面我可以数出我这样做的次数,但它总是暂时的。

【讨论】:

    【解决方案2】:

    泛型没有具体化,这意味着它们会在运行时消失。首选使用泛型有几个原因:

    • 它使您的代码更清楚,哪些类正在交互
    • 确保类型安全:您不会意外将列表添加到列表中
    • 更快:强制转换要求 JVM 在运行时测试类型可转换性,以防它需要抛出 ClassCastException。使用泛型,编译器知道事物必须是什么类型,因此不需要检查它们。

    【讨论】:

      【解决方案3】:

      该代码存在性能差异: 第二种方法实际上慢。

      原因:

      泛型不需要转换/转换(您的代码使用转换方法,不是转换),类型已经正确。所以当你调用toString()方法时,它是一个额外的调用,带有额外的操作,在使用泛型的方法时是不必要的。

      转换不会有问题,因为您使用的是toString() 方法。但是您可能会不小心添加了不正确的对象(例如 Strings 的数组)。 toString() 方法可以正常工作并且不会引发异常,但您会得到奇怪的结果。

      【讨论】:

      • 或更糟糕的是,如果添加了一个不正确的对象,该对象具有重写的 toString 方法。构造字符串可能需要很长时间,甚至会抛出 Throwable。
      • 所以我进行了测试,我并没有完全卖掉一个更快。
      • 好吧,String.toString 只是返回对自身的引用,因此编译器可能对其进行优化。然而,这不应该被依赖并且调用toString是一个额外的方法调用。但是,您的测试并未反映给定的案例。
      【解决方案4】:

      由于 android 用于资源有限的手机和手持设备,因此在编码时必须小心使用。 如果您使用 String 数据类型存储在 ArrayList 中,则转换可能会产生开销。 所以我认为你应该使用第一种具体的方法。

      【讨论】:

      • 我不明白这个答案。据我了解,类型擦除的过程实际上默默地将强制转换添加到字节码中。第一种方法隐式使用强制转换。第二种方法根本不使用强制转换。
      【解决方案5】:

      由于“type erasure”,没有运行时性能差异。

      但如果您使用的是 Java 1.5 或更高版本,则应该使用泛型而不是弱类型对应物。

      泛型的优点 --

      * The flexibility of dynamic binding, with the advantage of static type-checking. Compiler-detected errors are less expensive to repair than those detected at runtime.
      * There is less ambiguity between containers, so code reviews are simpler.
      * Using fewer casts makes code cleaner. 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2018-11-17
        • 1970-01-01
        相关资源
        最近更新 更多