Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 铸造和仿制药,有什么性能差异吗?_Java_Android_Casting - Fatal编程技术网

Java 铸造和仿制药,有什么性能差异吗?

Java 铸造和仿制药,有什么性能差异吗?,java,android,casting,Java,Android,Casting,我最近经常用Android编写代码,虽然我对JAVA很熟悉,但缺少一些 关于在那里使用的核心概念的想法 我想知道这两种代码之间是否存在性能差异 第一种方法: //Specified as member variable. ArrayList <String> myList = new ArrayList <String>(); 和使用 String temp1 = myList.get(1).toString(); 我知道这是关于演员的。第一种方法比第

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

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

第一种方法:

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

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

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

或者更一般的方式

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

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

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

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

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


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

由于“”的原因,运行时性能没有差异

但是,如果您使用的是Java1.5或更高版本,那么应该使用泛型,而不是弱类型的对应项

仿制药的优势--

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

原因是:

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


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

1941 rep,您不能正确格式化代码吗?:)(为什么要使用
标记和
字符?
序列是一个特别需要清理的问题)此外,如果您的“arraylist可以采用不同的类型”你经常使用
ArrayList
,那么你的类设计可能有问题。@Krik Woll-我想你的方法是告诉解决方案一个艰难的方法:)无论如何,我正在创建我的网站,在那里我将根据我的喜好整齐地格式化代码:)并使用Git。我会记住你的建议。@krikwoll-关于类设计是这样的,随着我的进步,我已经创建了更好的类结构。我的意思是告诉大家这里使用的是更通用的(比如对象)类型,最后我只是写了一个性能测试。见下文。它们的速度相同。如果添加了具有重写toString方法的不正确对象,则情况更糟。构造字符串可能会花费很长时间,甚至会抛出一个可丢弃的字符串。因此,我运行了测试,但我没有完全相信其中一个更快。嗯,
string.toString
只是返回一个对自身的引用,因此编译器可能会对其进行优化。但是,不应该依赖于此,调用
toString
是一个额外的方法调用。然而,你的测试并不能反映给定的情况。我不理解这个答案。据我所知,类型擦除的过程实际上是无声地将强制转换添加到字节码中。第一个方法隐式使用强制类型转换。第二种方法根本不使用强制类型转换。
ArrayList <Object> = new ArrayList <Object>(); 
* 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.