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;
        }
    }
经验分享 程序员 微信小程序 职场和发展