【问题标题】:java Type safety:not parameterized generic type effect on performancejava类型安全:非参数化泛型类型对性能的影响
【发布时间】:2011-07-27 17:25:28
【问题描述】:

我想知道是否只有安全风险或还有其他好处 我在参数化列表时得到。

我收到此警告

List 是原始类型 对泛型类型 List 的引用应该是 参数化

例如在声明列表时

List myList;

如果我改成这个,那么就没有警告

List<?> myList;

我明白为什么会有警告。 我有一个包含很多警告的代码,我想知道是否值得花时间修复所有这些警告。 我的问题是: 如果我不参数化列表,代码会运行得更慢吗? 我的意思是它必须在运行时进行更多检查吗?

编辑: 如果我更改为特定类型会影响性能吗?

List<String> myList;

【问题讨论】:

  • 它不会影响性能,但维护不使用原始类型的代码要容易得多。另一个好处是,当您从列表中获取项目时,您不必强制转换对象。但是请注意,只是从原始类型更改为 List> 并没有帮助。
  • 类型擦除意味着运行时性能不受影响。

标签: java generics warnings parameterized


【解决方案1】:

如果我不参数化列表,代码会运行得更慢吗?

没有

我的意思是它必须在运行时进行更多检查吗?

没有

如果你参数化你的类,效果将是增加代码的可读性,但只要你不使用任何反射的东西,一切都只是编译时间。

【讨论】:

    【解决方案2】:

    所有好处都在于编译时检查,运行代码将是相同的。话虽如此,您可能应该硬着头皮修复代码。

    编辑

    特定类型也不会以某种方式影响性能。简而言之:泛型类型信息仅对编译器可用(javac),它不做任何优化(除了一些非常微不足道的,在这里无关紧要的事情)。优化由 JVM 和 JIT 编译器完成,它们无法访问有关泛型类型的信息 - 因此,没有性能差异。

    【讨论】:

      【解决方案3】:

      如果您不对实例进行参数化,编译器将无法帮助您。

      不建议使用List&lt;?&gt; 来避免编译时检查,除非您在编译时真的不知道类型(有时会出现这种情况,所以我并不是说永远不要使用它)。

      【讨论】:

      • 如果我更改为特定类型会影响性能吗?
      • 不 - 它对性能没有影响,因为所有类型都在运行时被擦除
      【解决方案4】:

      这肯定属于过早优化的领域。编译器在将类型参数添加到生成的字节码中时所做的更改只是强制转换。当你写:

      List<String> values = new ArrayList<String>();
      values.add("One");
      values.add("Two");
      
      String value = values.get(0); // syntactic sugar
      

      编译器为最后一行生成对应的字节码

      String value = (String) values.get(0);
      

      所以隐藏的成本是铸造成本。正如Tom Hawtin's answer to 'Does Java casting introduce overhead?'指出的那样:

      这类事情在很大程度上与性能无关。

      我倾向于同意这一点 - 不用担心使用泛型时对性能的影响。

      【讨论】:

        【解决方案5】:
        1. 编译时检查将减少运行时出错的可能性。
        2. 使用迭代器时,将减少代码行数,因为您不需要显式强制转换。
        3. 这是一个很好的做法。
        4. 这种做法将提高代码的可读性。
        5. 另外我觉得你应该适应新版本(jdk 1.5 中添加的泛型)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-17
          • 1970-01-01
          • 2021-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-04
          • 1970-01-01
          相关资源
          最近更新 更多