我正在编写一个需要通用列表的 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];
}
}
我知道这个实现是有效的,但我不知道的是
- 实现起来安全吗?
- 我知道转换有点挑剔,因为 java 中内置了很多隐式转换,这实际上是绕过
Arraylist
已经执行的所有转换的一种方法吗? - 它比将每个元素转换为
ArrayList
中的正确类型效率更高/更低吗?
最佳答案
检查unrolled linked list ,这可能就是您所需要的。
接下来,您可能需要考虑通过扩展 AbstractList
来实际实现 List
以保持在集合框架内。 “数组包装器”最终使用起来会很麻烦。
接下来,转换可能会产生一些开销(请参阅 Does Java casting introduce overhead? Why? ),但我认为这没有什么值得考虑的。您的方法的缺点是您需要在每次使用时实现 empty
方法。从我的角度来看,对于值得怀疑的性能改进来说,这个代价太高了。
回答您的问题:
- 创建在子类中实现的数组模板方法是可以的。不太安全的是您在
content
方法中公开此数组。 - 我认为你无法摆脱 Actor 阵容。我也不认为选角表现值得担心。
- 运行基准测试并对其进行测量。我认为这会更有效一点,因为不需要类型检查,但这不会是重要/引人注目的事情。
关于java - 自定义数组包装类类型转换安全/效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41388513/