在用户定义的List(实现List)上使用的最佳内部数据结构是什么?

时间:2014-02-22 22:20:05

标签: java

我一直想知道一个简单的主题。如果我实现了一个接口,并在本例中说明了List。

在下面的示例中,我实现了List接口,这使我可以添加所有这些方法。如果我使用的是ArrayList(),则ArrayList已经为我实现了代码,我不必担心我的数据如何存储在集合中。如果我想创建自己的用户定义列表,那么我将不得不为所有方法实现代码。其中一种方法是add method()。

我是否必须创建自己的内部数据结构。我可以创建一个数组列表,只需将我的变量推送到堆栈中,但如果他们创建用户定义的List,那么这就是一个人想要做的事情。

private ArrayList lst = new ArrayList(); < - 内部数据结构

但这是一个人想要做什么,或者使用动态数组会更好,因为在用户定义列表的实例中使用ArrayList有点像在鸡之前使用鸡蛋。 ArrayList()已经实现了接口,并且构建了代码以便用户可以使用。

如果我从(面向对象编程)OOP中正确记得这就是所谓的数据封装。

问题:如果要实现List接口,最好使用哪种内部数据结构?

我试图找出何时创建一个新的Collection对象以用于我自己的内部数据结构是有用的。在下面的类中有实现List,它是我自己的测试调用,它将在新类测试中具有List的所有方法。我想知道的是如何编写这个新列表类的内部数据结构。

类别:

class test implements List {

    @Override
    public boolean add(Object arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void add(int arg0, Object arg1) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean addAll(Collection arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean addAll(int arg0, Collection arg1) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void clear() {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean contains(Object arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean containsAll(Collection arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Object get(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int indexOf(Object arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean isEmpty() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Iterator iterator() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int lastIndexOf(Object arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public ListIterator listIterator() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public ListIterator listIterator(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean remove(Object arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Object remove(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean removeAll(Collection arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean retainAll(Collection arg0) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Object set(int arg0, Object arg1) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int size() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public List subList(int arg0, int arg1) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object[] toArray() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Object[] toArray(Object[] arg0) {
        // TODO Auto-generated method stub
        return null;
    }
}

2 个答案:

答案 0 :(得分:3)

这个问题没有具体的答案。这完全取决于一些非常具体的情况,包括但不限于(并且没有特别的顺序):

  • 性能要求。
  • 接口要求(超出List)。
  • 代码清晰度,模块化和可重用性。
  • 线程要求。
  • 预期用途(例如,您希望快速插入/删除/追加/访问/等)。
  • 可用的开发时间。
  • 测试新容器所需的可用测试时间和额外工作。

你也总是要问:它值得吗?考虑到已经随JDK一起提供的各种容器(以及丰富的第三方库),如果您发现自己处于这些都不适合的情况下,您应该退一步并确保您绝对是正面的您需要实现一个新的容器(例如,可能会有一些更高级别的算法更改,这将使这不必要)。

关于继承与组合/授权;基本的“is a/has a”规则通常是一个很好的起点(它不是一个明确的规则,但它是一个很好的准则开始)。

简而言之,你问“但这是一个人想做什么?”答案是“是的,如果你想这样做,不,如果你不这样做。”

答案 1 :(得分:1)

几乎在每种情况下,最好使用内置结构。

如果你有一个特殊的数据类型,那就去做

ArrayList<YourClass> data=new Arraylist<YourClass>();

在许多情况下,这会让您不那么头疼。