首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >自定义数组包装器类浇铸安全性/效率

自定义数组包装器类浇铸安全性/效率
EN

Stack Overflow用户
提问于 2016-12-29 23:14:37
回答 2查看 197关注 0票数 1

我正在编写一个需要通用列表的java应用程序。这个列表需要能够动态地、经常地调整大小,显而易见的答案是一个通用的Linkedlist。不幸的是,它还需要获取/设置值,就像它通过调用索引来添加/删除它们一样频繁。这将通过一个Arraylist很好地解决。由于这两个选项都不是我想要的,所以我创建了自己的泛型数组包装类。我已经知道很长时间以来,创建泛型数组在java中是非法的,而且我已经阅读过这样的信息:通常不是使用泛型来定义数组的类型,而是只创建一个object[]数组,然后将每个元素分别转换为适当的类型。这类似于Arraylist已经做的事情;然而,我已经看到,在java中,强制转换是一项非常昂贵的操作。因此,为了避免转换的必要性,我的自定义包装类如下所示。

代码语言:javascript
运行
复制
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作为类型的示例。

代码语言:javascript
运行
复制
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中那样将每一个元素转换成适当的类型更有效/更低?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-29 23:36:53

检查展开链表,这可能是您所需要的。

接下来,您可能需要考虑通过扩展List来实际实现AbstractList,以保持对集合框架的支持。使用“数组包装器”将变得非常麻烦。

接下来,强制转换可能会有一些开销(请参阅Java强制转换是否引入了开销?为什么?),但我认为没有什么值得考虑的。方法的缺点是,您需要在每次使用时都使用empty方法。在我看来,这是一个值得怀疑的性能改进的代价太高了。

回答你的问题:

  • 创建在子类中实现的数组模板方法是可以的。更不安全的是在content方法中公开这个数组。
  • 我不认为你能摆脱演员。我也不认为演员表演是值得担心的事情。
  • 运行基准并测量它。我认为这会更有效一些,因为类型检查是不需要的,但这并不是什么重要的/引人注目的事情。
票数 1
EN

Stack Overflow用户

发布于 2016-12-29 23:31:53

我建议您不要将精力和时间花在创建自定义集合类型上,因为标准Java已经有了大量的定制集合类型。你将赢得时间,你将确保它是安全的和充分的功能。

例如,如果您确实需要经常调整大小,并且经常获取和设置项,我会选择其中一些:

1-如果您需要比调整大小的更直接的访问:一定要选择ArrayList。

2-如果您需要而不是直接访问,您可以使用LinkedList。

我会尝试使用HashMap,因为它是一个尝试优化直接访问和调整大小的集合,所以可能是您的最佳选择。唯一的区别是,您必须使用键而不是索引来访问集合中的值,但仍然可以像数组中的int索引那样使用Integer键。一个好的事情是,你也可以使用任何类型的对象作为关键。

此外,您可以使用LinkedHashMap,,因为如果需要的话,遍历整个集合的速度会更快。

无论如何,我不能向您保证这是您可以使用的最佳选项,但我可以向您保证,您将在Java中找到一个合适的(已经开发的)集合类型。

这就是我建议您阅读关于集合的正式文档的原因,您将对它们有一个大致的了解,并能够为您的特定问题选择最有效的-> collections.htm

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41388513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档