C# 性能,Java泛型
Java中的泛型是否比集合具有性能优势 例如,在C#中有一个性能优势,因为它有助于避免装箱/拆箱,但据我所知,在Java中,在字节码级别上没有泛型的“概念”,因此编译后它具有与集合相同的字节码C# 性能,Java泛型,c#,java,generics,C#,Java,Generics,Java中的泛型是否比集合具有性能优势 例如,在C#中有一个性能优势,因为它有助于避免装箱/拆箱,但据我所知,在Java中,在字节码级别上没有泛型的“概念”,因此编译后它具有与集合相同的字节码 那么说没有性能优势是对的吗?你说得对: 在Java中,在字节码级别没有泛型的“概念” 因此,Java中的泛型没有性能增益。没有性能优势,只有类型安全编程:) 那么说没有性能优势是正确的吗 虽然没有那么清楚,但总的来说,你是对的。在Java中,泛型只是编译器在后台为您执行所有转换的一种好方法 尽管如此,编译
那么说没有性能优势是对的吗?你说得对: 在Java中,在字节码级别没有泛型的“概念”
因此,Java中的泛型没有性能增益。没有性能优势,只有类型安全编程:) 那么说没有性能优势是正确的吗 虽然没有那么清楚,但总的来说,你是对的。在Java中,泛型只是编译器在后台为您执行所有转换的一种好方法
尽管如此,编译器最终可能会使用比您自己实现的更好的强制转换方法,在任何地方传递
对象。我认为此链接非常有用
正如您在C#中所说的,性能将受益于泛型,因为泛型可以帮助您避免装箱/拆箱。
究其深层原因,是.NET泛型支持值类型,但Java泛型不能处理基元类型,这就是为什么它不能消除装箱/取消装箱的开销
但仍然有编译时类型检查,代码中不需要显式强制转换 泛型强制执行类型检查的编译时验证,但编写操作对象的字节码。因此,当代码运行时,List
是一个List
,但不允许您List.add(new Date(…)
,因为编译器会阻止您忽略泛型类型
由于在后台运行List As List,与未绑定的泛型理解数据结构相比,泛型在运行时绝对没有性能优势或劣势。Java泛型对性能的影响很小,因为它们是一种静态类型检查功能,并且在运行时不太存在。它们确实添加了一些您在非泛型版本中可能忽略的类型转换
然而,作为编译时特性也意味着它们在运行时不会保留多余的信息。额外的记帐会对性能产生一些负面影响。它只是隐式地执行类型转换,而不是要求用户手动执行。如果您要求性能差异,则说明您做得不对(tm)。@delnan:如果您引用Knuth,则说明您做得不对(c)。