【发布时间】:2016-12-29 23:14:37
【问题描述】:
我正在编写一个需要通用列表的 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)效率更高/更低?
【问题讨论】:
-
“我已经读到在 Java 中强制转换是一项非常昂贵的操作”——真的吗?你有数字支持吗?
-
@sisyphus 有一些开销,请参阅stackoverflow.com/questions/2170872/…
-
并不是说这完全回答了问题,但是您可以消除子类中的所有方法声明,除了
empty的具体实现。你需要访问数据数组而不是对数组索引使用额外的 getter 方法,并且担心显式转换的成本实际上会成为问题? -
@lexicore 当然,但是一切都有一些开销。问题的前提是
ArrayList和LinkedList性能不够好,而且选角“太贵了”。在创建自定义 Collection 实现之前,值得调查这些前提。 -
@sisyphus "但是一切都有*一些开销"* - 这绝对不是真的,不是所有的东西都有开销。
标签: java arrays generics casting