泛型 vs. 数组列表

17 浏览
0 Comments

泛型 vs. 数组列表

我在这里使用的系统是在.net 2.0之前编写的,没有使用泛型的好处。最终它被升级到了2.0版本,但由于时间限制,没有对代码进行重构。代码中有很多地方使用了ArrayList等将对象存储为对象的数据结构。\n从性能角度来看,修改代码以使用泛型是多么重要?我知道从性能角度来看,装箱和拆箱等操作是低效的,但实际上从中能获得多少性能提升呢?泛型是一种应该在未来使用的东西,还是应该有意识地更新旧代码以获取足够的性能变化?

0
0 Comments

泛型和数组列表都是在Java中用于存储和操作数据的工具。然而,它们有一些重要的区别,因此在选择使用哪种方式时需要考虑一些因素。

泛型是Java中的一个强大的特性,它允许我们在编译时指定数据类型。这意味着我们可以在编写代码时就能够确切地知道我们处理的数据类型是什么,从而避免在运行时出现类型错误。这种类型安全性是使用泛型的主要优势之一。

另一方面,数组列表是一种动态数组的实现,它可以自动调整大小以适应数据的添加和删除。它提供了一些方便的方法来操作数据,如添加、删除、获取和遍历等。

然而,数组列表也有一些限制。首先,数组列表只能存储对象类型,而不能存储基本类型。这意味着如果我们想存储int、boolean或其他基本类型的数据,我们需要将它们包装在对象中。这种包装和拆包的过程称为装箱和拆箱,会带来一些性能开销。此外,由于数组列表中的元素都是对象,所以在获取元素时需要进行类型转换,这也会导致一些性能损失。

出于这些原因,有时候我们可能需要在使用泛型和数组列表之间进行选择。如果我们关注性能,并且我们处理的数据类型是基本类型,那么数组列表可能是一个更好的选择。然而,如果我们更关注类型安全性,并且我们处理的数据类型是对象类型,那么泛型可能是更好的选择。

要解决这个问题,我们可以使用Java中的泛型来替代数组列表。使用泛型可以提供更好的类型安全性,同时也可以避免装箱和拆箱的性能开销。我们可以使用泛型来定义和使用各种类型的集合,而不仅仅是对象类型。

以下是使用泛型创建一个简单的集合的示例代码:

List strings = new ArrayList<>();
strings.add("Hello");
strings.add("World");
for (String s : strings) {
    System.out.println(s);
}

通过使用泛型,我们可以在编译时捕获类型错误,并提供更好的可读性和维护性。此外,我们还可以避免装箱和拆箱的性能开销,从而提高程序的性能。

泛型和数组列表都是在Java中用于存储和操作数据的工具。选择使用哪种方式取决于我们对性能和类型安全性的需求。如果我们更关注性能,并且处理的数据类型是基本类型,那么数组列表可能是一个更好的选择。然而,如果我们更关注类型安全性,并且处理的数据类型是对象类型,那么泛型可能是更好的选择。通过使用泛型,我们可以提供更好的类型安全性,并避免装箱和拆箱的性能开销。

0
0 Comments

泛型和数组列表之间的性能差异是一个普遍存在的问题。在一个简单的测试中,将一个100KB文件的字符串解析100,000次,并比较了使用泛型列表和数组列表两种方法的性能。

测试结果显示,使用泛型列表(List(Of Char))的方法耗时为612.293秒,而使用数组列表(ArrayList)的方法耗时为2,880.415秒。这意味着在这种情况下,泛型列表的性能是数组列表的4.7倍。

下面是测试代码,该代码被运行了100,000次:

Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
    Dim genList As New ArrayList
    For Each ch As Char In strToProcess.ToCharArray
        genList.Add(ch)
    Next
    Dim dummy As New System.Text.StringBuilder()
    For i As Integer = 0 To genList.Count - 1
        dummy.Append(genList(i))
    Next
End Sub
Public Sub Run(ByVal strToProcess As String) Implements IPerfStub.Run
    Dim genList As New List(Of Char)
    For Each ch As Char In strToProcess.ToCharArray
        genList.Add(ch)
    Next
    Dim dummy As New System.Text.StringBuilder()
    For i As Integer = 0 To genList.Count - 1
        dummy.Append(genList(i))
    Next
End Sub

从测试结果来看,使用泛型列表的方法比使用数组列表的方法更快。因此,如果需要处理大量数据并且对性能要求较高,建议使用泛型列表来代替数组列表。这可以提高代码的执行效率,减少处理时间。

0
0 Comments

问题的出现的原因是:

1. 泛型的性能更好,但是除非性能非常重要并且已经在其他领域进行了优化,否则在其他地方投入时间可能会获得更大的改进。

2. 泛型可以减少错误,因为类型可以在编译时检查。

3. 泛型更易读,不需要在代码中到处进行类型转换,很明显知道集合中存储了什么类型的数据。

4. 如果未来要使用泛型,那么在任何地方都使用它们更加清晰。

解决方法是:

1. 从现在开始使用泛型。

2. 如果有可靠的单元测试,那么在接触到代码时进行重构,改用泛型。

3. 把时间花在其他可以显著提高性能的重构/测量上,比如数据库调用、改变数据结构等,而不是在一些毫秒级别的地方进行优化。

下面是整理后的文章:

在编程中,我们经常需要处理各种数据集合。而在处理数据集合时,我们有时会遇到一个问题:应该使用泛型还是数组列表?

从技术上讲,泛型的性能更好。但是,除非性能非常重要并且已经在其他领域进行了优化,否则在其他地方投入时间可能会获得更大的改进。因此,我建议从现在开始使用泛型。如果你有可靠的单元测试,那么在接触到代码时进行重构,改用泛型。这样可以减少错误,并且代码更易读,因为不需要在代码中到处进行类型转换,很明显知道集合中存储了什么类型的数据。此外,如果未来要使用泛型,那么在任何地方都使用它们更加清晰。

当然,除了性能外,还有其他原因可以改用泛型。使用泛型可以减少错误,因为类型可以在编译时检查。此外,代码更易读,因为不需要在代码中到处进行类型转换,很明显知道集合中存储了什么类型的数据。如果未来要使用泛型,那么在任何地方都使用它们更加清晰。

尽管泛型的性能更好,但在大多数情况下,我们更应该关注代码的可读性和易于维护性。因此,我建议从现在开始使用泛型,并将时间花在其他可以显著提高性能的重构/测量上,比如数据库调用、改变数据结构等,而不是在一些毫秒级别的地方进行优化。

0