gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:42:00 29 4
gpt4 key购买 nike

我正在编写一个需要通用列表的 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com