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>();
或者更一般的方式
# 1 楼答案
泛型没有具体化,这意味着它们会在运行时消失。出于以下几个原因,首选使用仿制药:
# 2 楼答案
简而言之,如果存在性能差异的话,也没有什么值得担心的。无论如何,泛型信息都不会在运行时存储,因此没有任何其他事情会让事情变慢——正如其他答案所指出的,它甚至可能更快(尽管假设它稍微慢一点,但我仍然主张使用泛型)养成这样一种习惯,不要在这个级别上过多地考虑性能,这可能是件好事。可读性和代码质量通常比微观优化更重要
简而言之,泛型将是首选选项,因为它们保证了类型安全并使代码更易于阅读
就在arraylist中存储完全不同的对象类型(即与您使用的某些继承层次结构无关)而言,这几乎肯定是您的设计的一个缺陷!一方面,我可以数出我做这件事的次数,但这只是暂时的预兆
# 3 楼答案
该代码中存在性能差异: second方法实际上是较慢的
原因是:
泛型不需要强制转换(代码使用转换方法,而不是强制转换),类型已经正确。因此,当您调用
toString()
方法时,它是一个额外的调用,带有额外的操作,在将该方法用于泛型时,这些操作是不必要的在使用
toString()
方法时,强制转换不会有问题。但是您可能会意外地添加错误的对象(例如String
数组)。toString()
方法可以正常工作,不会抛出异常,但会得到奇怪的结果# 4 楼答案
由于android用于资源有限的手机和手持设备,所以在编码时必须小心使用。 如果使用字符串数据类型存储在ArrayList中,则强制转换可能会增加开销。 所以在我看来,你应该使用第一种具体的方法
# 5 楼答案
由于“type erasure”,运行时性能没有差异
但是,如果您使用的是Java1.5或更高版本,那么应该使用泛型,而不是弱类型的对应项
仿制药的优点--