我一直想知道一个简单的主题。如果我实现了一个接口,并在本例中说明了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;
}
}
答案 0 :(得分:3)
这个问题没有具体的答案。这完全取决于一些非常具体的情况,包括但不限于(并且没有特别的顺序):
List
)。你也总是要问:它值得吗?考虑到已经随JDK一起提供的各种容器(以及丰富的第三方库),如果您发现自己处于这些都不适合的情况下,您应该退一步并确保您绝对是正面的您需要实现一个新的容器(例如,可能会有一些更高级别的算法更改,这将使这不必要)。
关于继承与组合/授权;基本的“is a/has a”规则通常是一个很好的起点(它不是一个明确的规则,但它是一个很好的准则开始)。
简而言之,你问“但这是一个人想做什么?”答案是“是的,如果你想这样做,不,如果你不这样做。”
答案 1 :(得分:1)
几乎在每种情况下,最好使用内置结构。
如果你有一个特殊的数据类型,那就去做
ArrayList<YourClass> data=new Arraylist<YourClass>();
在许多情况下,这会让您不那么头疼。