java怎样实现动态数组?
在学习Tomcat源码时看到很多地方都用到了动态数组的设计,而不是直接使用集合。这种方法很值得我们学习借鉴,所以在此单独拿出来学习讨论。 比如其中向容器Server增加service的方法如下(其中与本文讨论无关的代码已省略):
private Service services[] = new Service[0];
public void addService(Service service) {
Service results[] = new Service[services.length + 1];
System.arraycopy(services, 0, results, 0, services.length);
results[services.length] = service;
services = results;
}
}
上面代码用System.arraycopy方法就很巧妙的将一个空间大小为0的数组动态变长。我们只需要声明一个数组类型而无需关心数组真正可用长度是多少。如果需要删除其中某个值,代码如下。
public void removeService(Service service) {
synchronized (servicesLock) {
int j = -1;
for (int i = 0; i < services.length; i++) {
if (service == services[i]) {
j = i;
break;
}
}
if (j < 0)
return;
int k = 0;
Service results[] = new Service[services.length - 1];
for (int i = 0; i < services.length; i++) {
if (i != j)
results[k++] = services[i];
}
services = results;
}
}
