java - 自定义数组包装类类型转换安全/效率

标签 java arrays generics casting

我正在编写一个需要通用列表的 Java 应用程序。该列表需要能够经常动态地调整大小,对此的明显答案是通用的Linkedlist。不幸的是,它还需要像通过调用索引添加/删除值一样频繁地获取/设置值。 Arraylist 可以很好地解决这个问题。由于这两个选项都不完全是我想要的,所以我创建了自己的通用数组包装类。我很早就知道在 java 中创建泛型数组是非法的,并且我读过,通常不使用泛型来定义数组的类型,而是创建一个 object[] 数组,然后将每个元素单独转换为正确的类型。这与 Arraylist 已经做的类似;然而,我读到在java中强制转换是一个非常昂贵的操作。因此,为了避免强制转换的必要性,我的自定义包装类看起来像这样。

public abstract class CustomArrayWrapper<E extends Object>{
    private E[] content;

    public abstract E[] empty(int n);

    public CustomArrayWrapper(){
        this.content = empty(0);
    }

    public CustomArrayWrapper(int n){
        this.content = empty(n);
    }

    public CustomArrayWrapper(E[] content){
        this.content = content;
    }

    public E[] content(){
        return content;
    }
}

这只是该类的基本框架,但主要思想是,数组包装器的每个特定使用都扩展了 empty(int n) 方法,返回一个大小为 n 的数组类型为 E 希望避免所有昂贵的转换。使用 String 作为类型的示例如下。

public class StringArrayWrapper extends CustomArrayWrapper<String>{

    public StringArrayWrapper(){
        super();
    }

    public StringArrayWrapper(int n){
        super(n);
    }

    public StringArrayWrapper(String[] content){
        super(content);
    }

    public String[] empty(int n){
        return new String[n];
    }
}

我知道这个实现是有效的,但我不知道的是

  1. 实现起来安全吗?
  2. 我知道转换有点挑剔,因为 java 中内置了很多隐式转换,这实际上是绕过 Arraylist 已经执行的所有转换的一种方法吗?
  3. 它比将每个元素转换为 ArrayList 中的正确类型效率更高/更低吗?

最佳答案

检查unrolled linked list ,这可能就是您所需要的。

接下来,您可能需要考虑通过扩展 AbstractList 来实际实现 List 以保持在集合框架内。 “数组包装器”最终使用起来会很麻烦。

接下来,转换可能会产生一些开销(请参阅 Does Java casting introduce overhead? Why? ),但我认为这没有什么值得考虑的。您的方法的缺点是您需要在每次使用时实现 empty 方法。从我的角度来看,对于值得怀疑的性能改进来说,这个代价太高了。

回答您的问题:

  • 创建在子类中实现的数组模板方法是可以的。不太安全的是您在 content 方法中公开此数组。
  • 我认为你无法摆脱 Actor 阵容。我也不认为选角表现值得担心。
  • 运行基准测试并对其进行测量。我认为这会更有效一点,因为不需要类型检查,但这不会是重要/引人注目的事情。

关于java - 自定义数组包装类类型转换安全/效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388513/

相关文章:

java - 标签栏粘在顶部而不是折叠工具栏下方

c# - C# 和 Java 之间的 AES/CBC/NoPadding

java - 在 JBoss 应用程序服务器中,如何确保部署中的所有模块对 jar 库使用相同的类加载器?

c# - 返回 IEnumerable 和调用 ToArray 时的 LINQ 意外行为

javascript - 在 JavaScript 中对数组更新/创建运行自定义方法

php - 将关联数组的键数组与整数索引数组进行比较

java - iTextPDF 库 JAVA - 无法解析导入 com.itextpdf

java - 类泛型的类型不匹配

Java 泛型,需要解释

c# - 在 Powershell 中,如何使用字节数组作为 C# 通用类之一的键类型?