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; } }