我正在编写一个需要通用列表的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];
    }
}我知道这个实现是可行的,我不知道的是
Arraylist已经执行的所有强制转换的一种方法吗?ArrayList中那样将每一个元素转换成适当的类型更有效/更低?发布于 2016-12-29 23:36:53
检查展开链表,这可能是您所需要的。
接下来,您可能需要考虑通过扩展List来实际实现AbstractList,以保持对集合框架的支持。使用“数组包装器”将变得非常麻烦。
接下来,强制转换可能会有一些开销(请参阅Java强制转换是否引入了开销?为什么?),但我认为没有什么值得考虑的。方法的缺点是,您需要在每次使用时都使用empty方法。在我看来,这是一个值得怀疑的性能改进的代价太高了。
回答你的问题:
content方法中公开这个数组。发布于 2016-12-29 23:31:53
我建议您不要将精力和时间花在创建自定义集合类型上,因为标准Java已经有了大量的定制集合类型。你将赢得时间,你将确保它是安全的和充分的功能。
例如,如果您确实需要经常调整大小,并且经常获取和设置项,我会选择其中一些:
1-如果您需要比调整大小的更直接的访问:一定要选择ArrayList。
2-如果您需要而不是直接访问,您可以使用LinkedList。
我会尝试使用HashMap,因为它是一个尝试优化直接访问和调整大小的集合,所以可能是您的最佳选择。唯一的区别是,您必须使用键而不是索引来访问集合中的值,但仍然可以像数组中的int索引那样使用Integer键。一个好的事情是,你也可以使用任何类型的对象作为关键。
此外,您可以使用LinkedHashMap,,因为如果需要的话,遍历整个集合的速度会更快。
无论如何,我不能向您保证这是您可以使用的最佳选项,但我可以向您保证,您将在Java中找到一个合适的(已经开发的)集合类型。
这就是我建议您阅读关于集合的正式文档的原因,您将对它们有一个大致的了解,并能够为您的特定问题选择最有效的-> collections.htm
https://stackoverflow.com/questions/41388513
复制相似问题