假设我有一个类,它在内部存储一个数据列表:
import java.util.List;
public class Wrapper
{
private List<Integer> list;
public Wrapper(List<Integer> list)
{
this.list = list;
}
public Integer get(int index) { return list.get(index); }
}
为了这个例子,假设它是一个有用且必要的抽象。现在,我关心的是:作为一个知道这个类的底层实现的程序员,我应该具体说明我在构造函数中要求哪种类型的 List 吗?为了演示,我做了这个测试:
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class Main
{
public static void main(String[] args)
{
long start;
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2 = new LinkedList<Integer>();
Wrapper wrapper1, wrapper2;
for(int i = 0; i < 1000000; i++)
{
list1.add(i);
list2.add(i);
}
wrapper1 = new Wrapper(list1);
wrapper2 = new Wrapper(list2);
start = System.currentTimeMillis();
wrapper1.get(500000);
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
wrapper2.get(500000);
System.out.println(System.currentTimeMillis() - start);
}
}
您很可能知道,与数组相比,使用链表随机访问元素需要更多时间。那么,回到 Wrapper 构造函数,我应该是通用的并允许任何类型的 List,还是应该指定用户传递一个 ArrayList 以确保最佳性能?虽然在此示例中,用户可能很容易猜测get方法的底层实现是什么,但您可以想象这是更复杂的事情。提前致谢!