Casting和Generics,任何性能差异?

sat*_*sat 5 java android casting

我最近在Android上进行了很多编码,虽然我对JAVA很满意,但是缺少一些关于在那里使用的核心概念的想法.

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

第一种方法:

//Specified as member variable.   
ArrayList <String> myList  = new ArrayList <String>(); 
Run Code Online (Sandbox Code Playgroud)

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

第二种方法:

ArrayList myList  = new ArrayList(); //Specified as member variable.   
Run Code Online (Sandbox Code Playgroud)

和使用

String temp1 = myList.get(1).toString();   
Run Code Online (Sandbox Code Playgroud)

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

ArrayList <Object> = new ArrayList <Object>(); 
Run Code Online (Sandbox Code Playgroud)

或更通用的方式.

Mic*_*rry 7

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

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

就你在一个arraylist中存储完全不同的对象类型(即与你正在使用的某些继承层次结构无关)这一事实而言,这几乎肯定是你设计的一个缺陷!我可以算一下我做过这一次的时间,这总是一个暂时的躲避.


ste*_*fan 6

泛型不是具体的,这意味着它们会在运行时消失.出于以下几个原因,首选使用泛型:

  • 它使您的代码更清晰,哪些类正在交互
  • 它保持类型安全:您不会意外地将List添加到List
  • 它更快:如果需要抛出ClassCastException,则需要JVM在运行时测试类型可投射性.使用泛型,编译器知道必须是什么类型的东西,因此它不需要检查它们.