有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Casting和泛型,有什么性能差异吗?

我最近经常用Android编写代码,虽然我对JAVA很熟悉,但缺少了一些 关于在那里使用的核心概念的想法

我想知道这两种代码之间是否存在性能差异

第一种方法:

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

并使用asString temp = myList.get(1);

第二种方法:

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

和使用

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

我知道这是关于演员的。第一种方法比第二种方法有很大的优势吗, 大多数情况下,在实数编码中,我不得不使用第二种方法,因为arraylist可以采用不同的数据类型,最后我指定

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

或者更一般的方式


共 (5) 个答案

  1. # 1 楼答案

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

    • 它可以让你的代码更清晰,知道哪些类在交互
    • 它保证了它的类型安全:您不能意外地将列表添加到列表中
    • 它更快:强制转换需要JVM在运行时测试类型可强制转换性,以防它需要抛出ClassCastException。对于泛型,编译器知道事物必须是什么类型,因此不需要检查它们
  2. # 2 楼答案

    简而言之,如果存在性能差异的话,也没有什么值得担心的。无论如何,泛型信息都不会在运行时存储,因此没有任何其他事情会让事情变慢——正如其他答案所指出的,它甚至可能更快(尽管假设它稍微慢一点,但我仍然主张使用泛型)养成这样一种习惯,不要在这个级别上过多地考虑性能,这可能是件好事。可读性和代码质量通常比微观优化更重要

    简而言之,泛型将是首选选项,因为它们保证了类型安全并使代码更易于阅读

    就在arraylist中存储完全不同的对象类型(即与您使用的某些继承层次结构无关)而言,这几乎肯定是您的设计的一个缺陷!一方面,我可以数出我做这件事的次数,但这只是暂时的预兆

  3. # 3 楼答案

    该代码中存在性能差异: second方法实际上是较慢的

    原因是:

    泛型不需要强制转换(代码使用转换方法,而不是强制转换),类型已经正确。因此,当您调用toString()方法时,它是一个额外的调用,带有额外的操作,在将该方法用于泛型时,这些操作是不必要的

    在使用toString()方法时,强制转换不会有问题。但是您可能会意外地添加错误的对象(例如String数组)。toString()方法可以正常工作,不会抛出异常,但会得到奇怪的结果

  4. # 4 楼答案

    由于android用于资源有限的手机和手持设备,所以在编码时必须小心使用。 如果使用字符串数据类型存储在ArrayList中,则强制转换可能会增加开销。 所以在我看来,你应该使用第一种具体的方法

  5. # 5 楼答案

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

    但是,如果您使用的是Java1.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.